121. 买卖股票的最佳时机
视频讲解:动态规划之 LeetCode:121.买卖股票的最佳时机1_哔哩哔哩_bilibili
class Solution {
public int maxProfit(int[] prices) {
//注意这里说的是“持有”,“持有”不代表就是当天“买入”!也有可能是昨天就买入了,今天保持持有的状态。
//dp[i][0] 表示第i天持有股票所得最多现金 dp[i][1] 表示第i天不持有股票所得最多现金
//递推公式:由两种状态推导出来
//dp[i][0]:
//1.dp[i - 1][0]第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金
//即:dp[i - 1][0]
//2.-prices[i]买入此股 (因为本题之买卖一次) dp[i][0]
//dp[i][1]:
//1.dp[i - 1][1]第i-1天就不持有股票,那么就保持现状 2.prices[i] + dp[i - 1][0]
if (prices == null || prices.length == 0) return 0;
int ans = 0;
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(dp[i - 1][0], -prices[i]);
dp[i][1] = Math.max(dp[i - 1][1], prices[i] + dp[i - 1][0]);
}
return dp[prices.length - 1][1];
}
}
122.买卖股票的最佳时机II
视频讲解:动态规划,股票问题第二弹 | LeetCode:122.买卖股票的最佳时机II_哔哩哔哩_bilibili
class Solution {
public int maxProfit(int[] prices) {
int dp[][] = new int[prices.length][2];
dp[0][0] = 0;
dp[0][1] = -prices[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[prices.length - 1][0];
}
}