上一篇文章提到了一个股票买卖问题…我认为那个问题并不能作为动态规划问题分析,实际上我认为这道题也不能算作动态规划….
请注意,这道题同样也没有任何实际意义….它假设我们能够准确的预知未来的股票走向…这在生活中当然是不可能的…
问题
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2zsx1/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
分析
这道题和上一道股票买卖不同,我们可以多次进行买卖;
price={7,2,1,3,9,4,5}
在保持一笔交易的前提下,最大收益是多少?目测一下,1块钱买入,9块钱卖出,然后4块钱买入,5块钱卖出;最大收益是8+1=9块钱;
- 在第一天,相较前一天,不能产生任何收益
- 在第二天,相较前一天,同样不能产生任何收益
- 在第三天,相较前一天,还是不能产生任何收益
- 第四天,相较前一天,可以产生2块钱收益;
- 第五天,相较前一天,可以产生6块钱收益;
- 第六天,相较前一天,无法产生任何收益;
- 第七天,相较前一天,可以产生1块钱收益;
我们只需要比较每一天和前一天的差价,又可以确定是否产生收益;然后累加收益即可;
是否可以使用递归操作完成?其实也可以…这道题勉强算作动态规划吧;
将天数当作参数传入方法,返回可以赚到的钱
- 倒数第一天,传入参数7,计算总收益=总收益+price[7-1]-price[7-2];然后将倒数第二天(7-1)作为参数传入方法中;
代码
class Solution {private int result= 0;private int[] array;public int maxProfit(int[] prices) {if(prices.length==0||prices.length==1)return 0;//init arrayarray=prices;return maxResult(prices.length);}private int maxResult(int day){int temp=0;if(day-1==0)//边界检查return result+= temp;if(array[day-1]-array[day-2]>0)temp = array[day-1]-array[day-2];elsetemp=0;return result= temp + maxResult(day-1);}}
另一种方法
当然这个题不用递归也能做,而且效率更高,也很简单,直接遍历数组,计算两两元素之间的差值即可…这里不就写了
