● 121. 买卖股票的最佳时机 Best Time to Buy and Sell Stock - LeetCode
dp[i][0] 持有股票得到的最大现金
dp[i][1] 不持有股票得到的最大现金
dp[i][0] = max(dp[i - 1][0], -price[i]);
dp[i - 1][1]
dp[i - 1][0] + price[i]
dp[i][1] = max(dp[i - 1][0], dp[i - 1] + price[i])
初始化:
dp[0][0] = -price[0]
dp[0][1] = 0;
遍历顺序:从前往后
for(int i = 0; i < len; i++)
class Solution {
public int maxProfit(int[] prices) {
int min = prices[0];
int res = Integer.MIN_VALUE;
for (int i = 0; i < prices.length; i++) {
min = Math.min(min, prices[i]);
res = Math.max(res, prices[i] - min);
}
return res;
}
}
class Solution {
public int maxProfit(int[] prices) {
int n = prices.length;
int[][] dp = new int[n][2];
/**
dp[i][0]表示第i天持有股票
dp[i][1]表示第i天不持有股票
*/
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], -prices[i]);
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
}
return dp[n - 1][1];
}
}
● 122.买卖股票的最佳时机II Best Time to Buy and Sell Stock II - LeetCode
dp[i][0] 持有股票
dp[i][1] 不持有股票
class Solution {
public int maxProfit(int[] prices) {
int profit = 0;
for (int i = 1; i < prices.length; i++) {
profit += Math.max(prices[i] - prices[i - 1], 0);
}
return profit;
}
}
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];
}
}