【leetcode】122. 买卖股票的最佳时机 II( Best Time to Buy and Sell Stock II )


题目描述

【leetcode】122. 买卖股票的最佳时机 II( Best Time to Buy and Sell Stock II )
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

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

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

在这里插入图片描述

第一次解答

思路:
与股票问题1类似,只不过每一个波峰时就出售一次
把prices的散点图画出来,在每个极大值点卖出股票,股票买入价格取上一个极小值点

test case:
[2,1,2,0,1]
[7,1,5,3,6,4]
[1,2,3,4,5]

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        if(prices.size() == 0)
            return 0;
        
        int last_min_price = 0x7fffffff;
        int max_profit = 0;
        int max_local_profit = 0;

        for(int i=0; i<prices.size(); ++i){
            if(prices[i] < last_min_price){
                last_min_price = prices[i];
            }
            else if(prices[i]-last_min_price >=  max_local_profit){

                max_local_profit = prices[i]-last_min_price;
                //或左边不成立后才会判断右边,所以不担心i+1越界
                if(i+1 >= prices.size() || prices[i+1] < prices[i]){
                    max_profit += max_local_profit;
	                max_local_profit = 0;
	                last_min_price = prices[i];
                }

            }

        }
        max_profit += max_local_profit;


        return max_profit;
    }
};

结果:
在这里插入图片描述

第二次解答

看了题解,解法一的方法不变,但可以改变思路来简化代码。
解法一是每到一个极大值就卖出,利润=极大值-上一个极小值。
我们可以简化思路,不一定非要等到极大值就卖出,而是每有利润就卖出(因为我们并不是真正的在炒股,没有买入步骤)。

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

结果:
在这里插入图片描述

相关/参考链接

发布了88 篇原创文章 · 获赞 61 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/a435262767/article/details/103940925