代码随想录
121. 买卖股票的最佳时机
思路
动态规划思路:
dp[i][0]表示第i天的持有股票所得现金
dp[i][1]表示第i天的不持有股票所得现金
持有股票情况:取最大
第i天买入
dp[i][0] = -prices[i]
第i-1天就持有股票
dp[i][0]=dp[i-1][0]
不持有股票情况:取最大
第i天卖出(只有在已经持有股票的情况下才会卖出。即dp[i-1][0]<0)
dp[i][1]=dp[i-1][0]+prices[i]
前一天就没有
dp[i][1]=dp[i-1][1]
初始化:
dp[0]=0
代码
class Solution {
public int maxProfit(int[] prices) {
int dp[][] = new int[prices.length][2];
dp[0][0]=-prices[0];
dp[0][1]=0;
for(int i = 1;i<prices.length;i++){
dp[i][0]=Math.max(-prices[i],dp[i-1][0]);//持有股票
dp[i][1]=Math.max(dp[i-1][0]+prices[i],dp[i-1][1]);//不持有股票
}
return dp[prices.length-1][1];
}
}
122.买卖股票的最佳时机II
思路
思路:之前用贪心算法做过这道题
动态规划思路:
dp[i][0]表示第i天的持有股票所得现金
dp[i][1]表示第i天的不持有股票所得现金
持有股票情况:
第i天买入
dp[i][0] = dp[i-1][1]-prices[i]
第i-1天就持有股票
dp[i][0]=dp[i-1][0]
不持有股票情况:
第i天卖出
dp[i][1]=dp[i-1][0]+prices[i]
前一天就没有
dp[i][1]=dp[i-1][1]
初始化:
dp[0]=0
题解代码
class Solution
// 实现1:二维数组存储
// 可以将每天持有与否的情况分别用 dp[i][0] 和 dp[i][1] 来进行存储
// 时间复杂度:O(n),空间复杂度:O(n)
public int maxProfit(int[] prices) {
int n = prices.length;
int[][] dp = new int[n][2]; // 创建二维数组存储状态
dp[0][0] = 0; // 初始状态
dp[0][1] = -prices[0];
for (int i = 1; i < n; ++i) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]); // 第 i 天,没有股票
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]); // 第 i 天,持有股票
}
return dp[n - 1][0]; // 卖出股票收益高于持有股票收益,因此取[0]
}
}