LeetCode 122. Best Time to Buy and Sell Stock II 解题报告

来源:互联网 发布:淘宝助理不显示宝贝 编辑:程序博客网 时间:2024/05/17 15:38

LeetCode 122. Best Time to Buy and Sell Stock II 解题报告

题目描述

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times). However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).


示例

没有给出,建议自己先在LeetCode上测试几个用例,对比结果来理解题意。


限制条件

没有明确给出。


解题思路

我的思路:

由于题目说了在某一天可以买卖任意次股票,所以我用一个变量curPrice保存自己第i天的股票价,当我的股票价比i+1天的股票价低时,在第i+1天直接卖出就可以得到利润。如果我的股票价比i+1天的股票价高时,我在第i天原价卖出自己的股票,并以i+1天的股票价(更低价)买进。
那不用考虑i+2天以及之后的股价么?其实不用,解释如下:
如果i+2天的股价比i+1天高,那么我们同样在i+2天卖出。其效果等同于保留第i天到第i+2天才卖出,例子: 1 2 3。 3 - 1 = (2 - 1)+(3 - 2)。
如果i+2天的股价比i+1天低,那么我们在i+1天原价卖出并在第i+2天以更低价买入。
然后会发现第i天的决策与第i+1天的决策是一样的:明天的价格比今天高就明天卖出,明天的价格比今天低,就今天卖出,明天买进。
所以根据这一点,利用代码实现就可以了,认真想想的话,其实这就是一种贪心算法。

参考思路:

LeetCode官网给出了3种参考解法,然而前两种其实挺复杂的就不多说,第3种的解释直接上图:
参考思路
图中的意思就是从3开始往后观察的话,会发现局部最优A+B+C=D全局最优。因此只要遍历一遍数组,并在当前元素比前一个元素大时,增加他们之差到利润中,最后就能得到最大的利润。典型的贪心算法的思想。


代码

我的代码

class Solution {public:    int maxProfit(vector<int>& prices) {        int profit = 0;        int curPrice = prices.empty() ? 0: prices[0];        for (auto p: prices) {            if (p > curPrice) {                profit += (p - curPrice);                curPrice = p;            }            else if (p < curPrice) {                curPrice = p;            }        }        return profit;    }};

参考代码

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

总结

这道题的难点在于分析出它是一个贪心算法,只要能知道这一点,实现就很容易了。
终于填好了今天的两个坑。明天加油~

0 0
原创粉丝点击