LeetCode121-买卖股票的最佳时机
这道题其实一开始知识一道数组类别的题目,然而动态规划的思想就是厉害。
其实问题就是选一个买进的日期,然后在后面的区间内求最大值。
假如第一天买入,在后面的天数内找到最大值。
第二天买入,在后面的天数内找到最大值。
这是递归的思想。
那么改成自底向上呢?
我们只要从后面开始,一直维护一个最大值数组即可。
数组第i个元素,存的是i~n里的最大值。
public int maxProfit(int[] prices) { int len = prices.length; //没有交易完成,最大利润是0 int max = 0; //最后一个不用管 for(int i=len-2;i>=0;i--){ int cur = prices[i]; int next = prices[i+1]; //当前比后面区间的最大值要小,就是有钱赚 if(cur<next){ int temp = next-cur; if(temp>max) max=temp; //更新当前的元素,将它的值,设为这个区间内最大值,也是就后面的元素 prices[i]=next; }else if(cur>next){ //如果当前比后面区间的大,就是没钱赚 //因为后面是卖出的价格,比你今天买入的都低 //不用更新当前区间最大值,因为最大值是它自己 }else{ //如果是等于 //那么也没钱赚,最大值也是他自己 } } return max; }
一次通过,并且基本上是最优解了。
递归是函数调用,会花额外的时间。