上一篇文章提到了一个股票买卖问题…我认为那个问题并不能作为动态规划问题分析,实际上我认为这道题也不能算作动态规划….
请注意,这道题同样也没有任何实际意义….它假设我们能够准确的预知未来的股票走向…这在生活中当然是不可能的…

问题

给定一个数组,它的第 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块钱;

  1. 在第一天,相较前一天,不能产生任何收益
  2. 在第二天,相较前一天,同样不能产生任何收益
  3. 在第三天,相较前一天,还是不能产生任何收益
  4. 第四天,相较前一天,可以产生2块钱收益;
  5. 第五天,相较前一天,可以产生6块钱收益;
  6. 第六天,相较前一天,无法产生任何收益;
  7. 第七天,相较前一天,可以产生1块钱收益;

我们只需要比较每一天和前一天的差价,又可以确定是否产生收益;然后累加收益即可;
是否可以使用递归操作完成?其实也可以…这道题勉强算作动态规划吧;
将天数当作参数传入方法,返回可以赚到的钱

  1. 倒数第一天,传入参数7,计算总收益=总收益+price[7-1]-price[7-2];然后将倒数第二天(7-1)作为参数传入方法中;

实际上就这样递归即可;

代码

  1. class Solution {
  2. private int result= 0;
  3. private int[] array;
  4. public int maxProfit(int[] prices) {
  5. if(prices.length==0||prices.length==1)
  6. return 0;
  7. //init array
  8. array=prices;
  9. return maxResult(prices.length);
  10. }
  11. private int maxResult(int day)
  12. {
  13. int temp=0;
  14. if(day-1==0)//边界检查
  15. return result+= temp;
  16. if(array[day-1]-array[day-2]>0)
  17. temp = array[day-1]-array[day-2];
  18. else
  19. temp=0;
  20. return result= temp + maxResult(day-1);
  21. }
  22. }

另一种方法

当然这个题不用递归也能做,而且效率更高,也很简单,直接遍历数组,计算两两元素之间的差值即可…这里不就写了