【每日一题】买卖黄金最佳策略(C++)

今天参加爱德万测试公司的笔试,有一道编程题十分类似,具体题目稍后上传,先放出题解

7.10更新

题目大意翻译如下: 

黄金价格每天都会变动,黄金价格的走势如下图,如果你在day 0买入在day 2卖出,然后再在day 4买入在day 7卖出就可以挣得最大的利润。如果你在一个黄金价格走势单调递减的曲线图中买入,你不会有任何利润。

本题中买入和卖出可以有任意次数,但买入再到卖出的过程中间不能有任何买入(ps:这是我自己加的,题目中应该也隐含这个意思)

请设计程序输出最佳的策略。

可以直观地看到,只需要找到黄金价格开始上涨的最小值黄金价格上涨到的最大值 ,在最小值点买入黄金并在最大值点卖出,计算这一段之间的差就是这段时间内股票的最大利润。最后只需要把所有上涨时间段内的利润累加起来就是要求的结果。贪心思想

但是这个区间很难划分,引用题解中大佬的解法来解释:

在这道题目中,只要是在上升的,我们就计算上升的增量,然后对所有增量进行累加,并不需要找到这段完整增量区间的最小值和最大值再来求差值。

我们结合图片来理解一下,当连续几天股价都在增长的情况下,可以看成在上升的第二个点,我先卖出再买入。连续下降的时候我就不买入,这一天我手中是没有股票的。

2
也可以结合数学公式来理解,在一段上升区间 a<b<c,则这段区间的增量是 (c-a),同样可以这样计算 (b-a)+(c-b),到这一步应该一切都明明白白了。 

我们只要把 prices 数组遍历一遍,并且在遍历的过程中用后一项减前一项,如果是正数则累加,负数则不加,得到 4+3=7。

3

int maxProfit(vector<int>&prices){
        int total = 0;
        for(int i=0;i<prices.size()-1;i++){
            total += max(prices[i+1]-prices[i],0);
        }
        return total;
    }

​​​​​​​LeetCode121&122.买卖股票的最佳时期(C++)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

7_lining

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值