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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值