今天参加爱德万测试公司的笔试,有一道编程题十分类似,具体题目稍后上传,先放出题解
7.10更新
题目大意翻译如下:
黄金价格每天都会变动,黄金价格的走势如下图,如果你在day 0买入在day 2卖出,然后再在day 4买入在day 7卖出就可以挣得最大的利润。如果你在一个黄金价格走势单调递减的曲线图中买入,你不会有任何利润。
本题中买入和卖出可以有任意次数,但买入再到卖出的过程中间不能有任何买入(ps:这是我自己加的,题目中应该也隐含这个意思)
请设计程序输出最佳的策略。
可以直观地看到,只需要找到黄金价格开始上涨的最小值和黄金价格上涨到的最大值 ,在最小值点买入黄金并在最大值点卖出,计算这一段之间的差就是这段时间内股票的最大利润。最后只需要把所有上涨时间段内的利润累加起来就是要求的结果。贪心思想
但是这个区间很难划分,引用题解中大佬的解法来解释:
在这道题目中,只要是在上升的,我们就计算上升的增量,然后对所有增量进行累加,并不需要找到这段完整增量区间的最小值和最大值再来求差值。
我们结合图片来理解一下,当连续几天股价都在增长的情况下,可以看成在上升的第二个点,我先卖出再买入。连续下降的时候我就不买入,这一天我手中是没有股票的。
也可以结合数学公式来理解,在一段上升区间 a<b<c,则这段区间的增量是 (c-a),同样可以这样计算 (b-a)+(c-b),到这一步应该一切都明明白白了。
我们只要把 prices 数组遍历一遍,并且在遍历的过程中用后一项减前一项,如果是正数则累加,负数则不加,得到 4+3=7。
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;
}