力扣-122. 买卖股票的最佳时机 II

流过昼夜 提交于 2020-09-29 16:57:13

0. 题目

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

示例 2:

输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
     因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

示例 3:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:

1 <= prices.length <= 3 * 10 ^ 4
0 <= prices[i] <= 10 ^ 4

1.我的思路

  我最开始的思路错了,我开始琢磨起二维数组来了,后来发现各种各样的可能性,难道需要把这些可能性都记住?断断续续在休息的间隙思考了一天,晚上在食堂吃饭的时候突然想到自己不需要给出所有买卖的过程,只需要关注盈利的结果,也就是多有可以赚钱的交易。最简单的就是昨天买了,今天卖出是否挣钱。昨天买了今天涨了,明天也涨了,明天卖出的,也是挣的(今天-昨天)+(明天-今天),所以根本不需要关注哪天买入哪天抛售。故我的题解为:

class Solution {
    public int maxProfit(int[] prices) {
        int maxProfit = 0;
        int pricesLength = prices.length;
        int[] profitArray = new int[pricesLength];
        for (int i = 0; i < pricesLength; i++) {
            int j = i + 1;
            if (j < pricesLength && prices[j] > prices[i]) {
                profitArray[j] = prices[j] - prices[i];
            }
        }
        for (int i = 0; i < profitArray.length; i++) {
            maxProfit += profitArray[i];
        }
        return maxProfit;
    }
}

2. 官方题解

class Solution {
    public int maxProfit(int[] prices) {
        int maxprofit = 0;
        for (int i = 1; i < prices.length; i++) {
            if (prices[i] > prices[i - 1])
                maxprofit += prices[i] - prices[i - 1];
        }
        return maxprofit;
    }
}

3.我的感想

  有时候思考问题感觉很难,并不是自己笨,而是努力的方向不对。没有看清关键的影响因素,没有抓住问题的本质。我的答案与正确答案还是有一定的差距,我多申请了一个数组去装所有盈利的日子,但是这是不必要的,我们只需要求得一个和即可。只有在我们需要给出交易的具体步骤时,才需要记录下来这样的盈利的日子。

  有的朋友说题目的前提条件有点不现实,说购买之前必须全部抛售。我倒是觉得非常正常,就是在你没有多少本金的情况下进行交易的真实状况。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!