力扣122题(买卖股票,贪心算法)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

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

  1. 看到题目很自然的想法就是如果后一天的股票价格比前一天的股票价格就买入,如果后一天的股票价格比前一天的股票价格低就卖出,觉得只在股票会涨价的时候卖出就是贪心所在。于是有了以下代码,但是由于很多种情况没考虑周全,比如没有考虑到某一天股票价格为0、以及股票价格会连续几天不变动、股票价格永远不变动等情况,导致代码改了很多遍才提交成功。
int maxProfit(int* prices, int pricesSize){
    int profit = 0; //用于累计当前的利润
    int purchase = -1; // 用于记录当前是否已经购买股票
    for (int i = 0; i < pricesSize - 1; i++) {
        if (prices[i + 1] > prices[i] && purchase == -1) { //如果后一天价格比前一天价格高,且还没买入股票,就买入
            purchase = prices[i];
        }
        if (prices[i + 1] < prices[i] && purchase != -1) { //如果后一天价格比前一天价格低,且已经买入股票,就卖出
            profit = profit + prices[i] - purchase;
            purchase = -1;
        }
        if (i + 1 == pricesSize - 1 && purchase != -1) { //如果股票到最后一天还没卖出的话,要把股票卖掉
            profit = profit + prices[i + 1] - purchase;
        }
    }
    return profit;
}
  1. 上面给出的代码虽然算不上复杂,但是题解给出来的解法更加简单。如果我们把每一天的股票收益(亏损)计算出来的话,由于我们是要获得最大利润,那么当会发生亏损的时候,我们是不会购买股票的,也就是说,我们只需要把所有的股票收益加总起来,而不管亏损的话,就能够获得最大利润。贪心体现在收集每天的正利润,从而获得全局的最大利润。这个解法可以说相当简单了。
int maxProfit(int* prices, int pricesSize){
    int profit = 0;
    for (int i = 0; i < pricesSize - 1; i++) {
        if (prices[i + 1] - prices[i] > 0) {
            profit = profit + prices[i + 1] - prices[i];
        }
    }
    return profit;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值