“当你越来越专注自身的时候,不断精进,你就会变得越来越清醒,整个人的气运,会进入一个排毒状态,在长达一两年的时间内,你会攀援到一个新的台阶,会和很多人告别,会刹那间想通很多的事情。”
给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。
你只能选择某一天买入这只股票,并选择在未来的某一天不同的日子卖出该股票。设计一个算法来计算你所能获取的最大利润。
d1买入 d1回收 d2回收 d3回收 d4回收 总共n
1 / -6 -2 -4 -1 -3
2 / / 4 2 5 3
3 / / / -2 1 -1
4 / / / / 3 1
5 / / / / -2
6 / / / / /
可以通过一个max来存储最大值(初始为0),这样都最后便可以直接取到结果了。
代码:
class Solution {
public int maxProfit(int[] prices) {
int length = prices.length;
// int[][] dp = new int[length][length];
int max = 0;
for(int i = 0; i < length; i++){
if(prices[i] > price[i+1] && i < length - 2){
continue;
}
for(int j = i + 1; j < length; j++){
if(prices[j] - prices[i] > max){
max = prices[j] - prices[i];
}
}
}
return max;
}
}
运行后发现超出内存,考虑优化。其实在上述代码中我们完全未使用到dp,直接删掉即可。
再次运行发现又超出时间限制(双重循环)。考虑双指针实现发现不靠谱,思考后是dp方式有问题,双重循环的开销太大了,可以在一次循环中不断记录到目前为止可以用的最大利润。则dp数组大小以及时间复杂度由n^2变为2n。
d1买入 maxTotalProfit minDayProfit
1 0 7
2 0 1
3 4 1
4 4 1
5 5 1
6 5 1
```java
代码:
class Solution {
public int maxProfit(int[] prices) {
int length = prices.length;
int maxP = 0;
int min = prices[0];
int[][] dp = new int[length][2];
dp[0][0] = maxP;
dp[0][1] = min;
for(int i = 1; i < length; i++){
dp[i][0] = Math.max(prices[i] - dp[i - 1][1], dp[i - 1][0]);
dp[i][1] = Math.min(dp[i - 1][1], prices[i]);
}
return dp[length - 1][0];
}
}