这道题,我想得比较细,也就是把优化的步骤都想好了。另外一些解法是套路模版,就是local 和 global两个变量来进行 不断交互比较。所以没有忽略一些可以忽略的情况。哪种模版的情况再处理复杂问题,即可以优化的情况不是很明显的题型时还是比较powerful的。
和下一道题目对比的话,这里只限买卖一次,下一道是买卖多次,多次的话就是 逢低就卖,再一这个低价买入,交易就发生在低价出现之前。有了这个high level的逻辑,代码就好写了。
代码如下:
class Solution {
public int maxProfit(int[] prices) {
int len=prices.length;
if(len==0) return 0;
int profit=0;
int low=prices[0];
int high=prices[0];
for(int day=0; day<len; day++){
if(prices[day]<low){
low=prices[day];
high=prices[day];
}
else if(prices[day]>high){
high=prices[day];
profit=Math.max(profit,high-low);
}
}
return profit;
}
}
// 相比之前的代码,我这个快多了,代码更多但是判断的条件更加明确,而不是没遇到一个elem就要进行min和max的更新。
// 就把把这array想象成股票价格图中的bar,无非就是找到从左到右方向上的 最小值 到 最大值的 差距。
// 而且题意给得很清楚,最小值就是0,当天买卖,所以min和max就都可以 从第一天的开始。
// 如果比high高,才有必要update:high & profit,在low和high之间,没有必要update。
// 如果比low低,那么就要update low,同时以为着之前的low所对应的最大profit已经终结。之后判断的都是以新的low为基准来进行的比较。high也更新了,然后profit不用更新。
// 总结一下,前几次提交的code,看看现在的思路为什么又快又好。