题目地址:
https://www.lintcode.com/problem/best-time-to-buy-and-sell-stock-ii/description
给定一个正数数组 A A A,代表每天股票的价格。允许做无限次买卖交易,但是在持有股票的时候只能卖而不能买。问能获得的最大利润是多少。
显然要获得最大利润,就是要把每次股价上升的波段完整吃到。设
f
[
i
]
f[i]
f[i]是到
A
[
i
]
A[i]
A[i]这个价格为止,能赚到的最多的钱数。则有:
f
[
i
+
1
]
=
f
[
i
]
+
max
{
0
,
A
[
i
+
1
]
−
A
[
i
]
}
f[i+1]=f[i]+\max\{0,A[i+1]-A[i]\}
f[i+1]=f[i]+max{0,A[i+1]−A[i]}证明如下:
1、如果在
A
[
i
]
A[i]
A[i]时持有股票,那么显然最大利润就是,如果股价接下来下跌,就当天卖出;否则持有到第二天;
2、如果在
A
[
i
]
A[i]
A[i]时未持有股票,那么显然最大利润就是,如果股价接下来下跌,就不操作;否则当天买入然后第二天卖出;
代码如下:
public class Solution {
/**
* @param prices: Given an integer array
* @return: Maximum profit
*/
public int maxProfit(int[] prices) {
// write your code here
int res = 0;
for (int i = 1; i < prices.length; i++) {
res += Math.max(0, prices[i] - prices[i - 1]);
}
return res;
}
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( 1 ) O(1) O(1)。