题目大意
这道题与上一题类似,不过区别在于,可以对股票进行无限次购买,可在购买之前需要将已经购买的卖出。
分析
一种很直观的想法,当当前值大于下一天的我们就卖出,如果小于就更新最大值或者卖出再买入,但是需要证明:
考虑的其实就是一个这样的状态,如果有四天的股票价格分别为a b c d,a<b且c<d,现在究竟该在a买b卖c买d卖,还是a买d卖(等价于a买入bc连续卖出买入,最后在d卖出),做差比较一下(d-c)+(b-a)-(d-a)=b-c,根据这个结果可以证明当第二天b的价格小于第三天c的时候,我们连续买就可以了,如果大于那么就分开来买。
代码
public int maxProfit(int[] prices) {
int n = prices.length;
if(n == 0) {
return;
}
int sum = 0, minm = prices[0], maxm = prices[0];
for(int i = 1; i < n; i++) {
if(prices[i] > maxm) {
maxm = prices[i];
sum += (maxm - minm);
minm = prices[i];
maxm = prices[i];
} else {
if(prices[i] < minm) {
minm = prices[i];
maxm = prices[i];
}
}
}
return sum;
}