目录
🎈LeetCode123.买卖股票的最佳时机III
🎈LeetCode188.买卖股票的最佳时机IV
🎈LeetCode123.买卖股票的最佳时机III
链接:123.买卖股票的最佳时机III
给定一个数组,它的第
i
个元素是一支给定的股票在第i
天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
public int maxProfit(int[] prices) {
// dp[i][0] 第i天第一次持有股票的最大利润
// dp[i][1] 第i天第一次不持有股票的最大利润
// dp[i][2] 第i天都二次持有股票的最大利润
// dp[i][3] 第i天第二次不持有股票的最大利润
int[][] dp=new int[prices.length][4];
// dp[i][0]=Math.max(dp[i-1][0],-prices[i]);
// dp[i][1]=Math.max(dp[i-1][1],prices[i]+dp[i-1][0]);
// 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[0][0]=-prices[0];
dp[0][1]=0;
dp[0][2]=-prices[0];
dp[0][3]=0;
for(int i=1;i<prices.length;i++){
dp[i][0]=Math.max(dp[i-1][0],-prices[i]);
dp[i][1]=Math.max(dp[i-1][1],prices[i]+dp[i-1][0]);
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]);
}
return dp[prices.length-1][3];
}
🎈LeetCode188.买卖股票的最佳时机IV
链接:188.买卖股票的最佳时机IV
给你一个整数数组
prices
和一个整数k
,其中prices[i]
是某支给定的股票在第i
天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成
k
笔交易。也就是说,你最多可以买k
次,卖k
次。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
public int maxProfit(int k, int[] prices) {
int[][] dp=new int[prices.length][2*k+1];
for(int i=1;i<=k*2;i+=2){
dp[0][i]=-prices[0];
}
for(int i=1;i<prices.length;i++){
for(int j=1;j<=2*k;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][2*k];
}