动态规划 --- 买卖股票问题
121.买卖股票的最佳时机
解题思路:
- 只能买卖一次 --- 每个位置两个状态
- dp数组含义: 当前位置持有股票 | 未持有股票的状态
- 持有:可以是延续之前持有的状态, 也可以是今天买入
- 未持有: 可以是延续之前未持有的状态, 也可以是今天卖出
代码:
class Solution {
// 只能买卖一次
public int maxProfit(int[] prices) {
int n = prices.length;
// 动态规划
// 第一次持有股票的最大价值
// 第一次未持有股票的最大价值
int[][] dp = new int[n + 1][2];
dp[0][0] = -prices[0];
dp[0][1] = 0;
for(int i=1; i < n; i++){
// 第一次持有:保持之前买入的状态 | 今天买入
dp[i][0] = Math.max(dp[i-1][0], -prices[i]);
// 第一次未持有:保持之前未持有的状态 | 今天卖出
dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]);
}
return dp[n-1][1];
}
}
122.买卖股票的最佳时机II
解题思路:
动态规划
- 定义dp数组含义:持有和未持有的状态
- 与121题目不同的是,
- 本题要求持有的状态可以是继续持有, 也可以是今天买入, 但是今天买入一定是在之前未持有的状态
- 本题要求未持有的状态可以是继续未持有, 也可以是今天卖出, 但是今天卖出一定是在之前持有的状态
代码:
class Solution {
// 可以买卖多次 --- 最多只能持有一只股票
public int maxProfit(int[] prices) {
int n = prices.length;
int[][] dp = new int[n][2];
dp[0][0] = -prices[0];
dp[0][1] = 0;
for(int i=1; i < prices.length; i++){
dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] - prices[i]);
dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]);
}
return dp[n-1][1];
}
}