1. 买卖股票的最佳时机
只能买卖一次
class Solution {
public int maxProfit(int[] prices) {
int length = prices.length;
// dp[i][0]代表第i天持有股票的最大收益
// dp[i][1]代表第i天不持有股票的最大收益
int[][] dp = new int[length][2];
// 第一天
dp[0][0] = -prices[0]; // 买 支出了这么多
dp[0][1] = 0;
// 第二天开始
for(int i = 1; i < length; 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[length - 1][1];
}
}
2. 买卖股票的最佳时机 II
可以多次买卖
class Solution {
public int maxProfit(int[] prices) {
int length = prices.length;
// dp[i][0]代表第i天持有股票的最大收益
// dp[i][1]代表第i天不持有股票的最大收益
int[][] dp = new int[length][2];
// 第一天
dp[0][0] = -prices[0]; // 买 支出了这么多
dp[0][1] = 0;
// 第二天开始
for(int i = 1; i < 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[length - 1][1];
}
}