Leetcode买卖股票的最佳时机Ⅱ算法与分析

@Leetcode买卖股票的最佳时机Ⅱ

第二道炒股的题,这次可以真正的”炒“股了!请看题干:

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:
在这里插入图片描述
示例 2:
在这里插入图片描述
示例 3:
在这里插入图片描述
拿到一看,和第一道买卖股票的最大区别就是可以多次购买了。多次购买的好处在于可以不用浪费利润,是一个比较优秀的购买策略(前提是你得知道每天的价格),那么编写上有什么区别吗?请看代码:

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

在这里插入图片描述
思路虽说容易,但是还是得费些神经并且得细心写这个循环(不太适合for)。我们的循环目的是为了找出每一个低谷和每一个下降谷之前的最高利润,并在这个最高利润处卖出之前买的股票(如果之前没买当然就无需卖),然后在下降至最低谷时买入,因为这个两个操作时刻都满足第二天股票必然下跌或者上涨的情况,所以此时的购买是一定稳赚不赔的。在代码中我们可以看到使用循环来挨个判断其后一天的股票价格即可。

那么看看本题的细节问题。使用vector自不用说,I的循环判断一定是要到size-1的位置才算遍历完全。最上面的判断是否为空的数组还是必要的,如果不进行特判空数组的样例依然是过不了笔者亲测,本来还想混水摸鱼省两行试试,结果并不能。其实本题无论是暴力还是递推判断都可以完成,方法很多并不局限,希望大家有所收获。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值