123.买卖股票的最佳时机III
思路: 这道题的关键就是如何设置dp数组的状态。用五种状态表示对股票持有或售出的不同阶段。代码随想录讲解视频
class Solution {
public int maxProfit(int[] prices) {
int[][] dp=new int[prices.length][5];
dp[0][0]=0;
dp[0][1]=-prices[0];
dp[0][2]=0;
dp[0][3]=-prices[0];
dp[0][4]=0;
for(int i=1;i<prices.length;i++){
dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]-prices[i]);
dp[i][2]=Math.max(dp[i-1][2],dp[i-1][1]+prices[i]);
dp[i][3]=Math.max(dp[i-1][3],dp[i-1][2]-prices[i]);
dp[i][4]=Math.max(dp[i-1][4],dp[i-1][3]+prices[i]);
}
return dp[prices.length-1][4];
}
}
时间复杂度:O(n)
空间复杂度:O(n × 5)
188.买卖股票的最佳时机IV
思路: 在上一题2次的基础上变为k次。可以发现规律:除了0以外,偶数就是卖出,奇数就是买入。
因此dp数组的维度为[n][k*2+1]
class Solution {
public int maxProfit(int k, int[] prices) {
int[][] dp=new int[prices.length][k*2+1];
for(int i=0;i<k*2+1;i++){
if(i%2==0){
dp[0][i]=0;
}else{
dp[0][i]=-prices[0];
}
}
for(int i=1;i<prices.length;i++){
for(int j=1;j<k*2+1;j++){
if(j%2==0){
dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-1]+prices[i]);
}else{
dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-1]-prices[i]);
}
}
}
return dp[prices.length-1][k*2];
}
}
时间复杂度:O(nk)
空间复杂度:O(nk)