一、买卖股票的最佳时机 (LeetCode 121)
简单的动态规划问题,只能完成一次买卖,定义二维 dp[i] [] 数组,dp [i] [0]表示没有股票的状态,dp [i] [1]表示持有股票的状态,由于只能买卖一次股票所以 dp [i] [1]不受dp [i-1] [0]的影响
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(-prices[i],dp[i-1][1]);
}
return dp[prices.length-1][0];
}
由于dp[i] [0] 只受 dp[i-1] [0] 和 dp[i-1] [1] 的影响,dp[i] [1] 只受 dp[i-1] [1] 的影响,所以可以化为一维数组对代码进行优化
public int maxProfit(int[] prices) {
int[] dp = new int[2];
dp[0] = 0;
dp[1] = -prices[0];
for (int i = 1; i < prices.length; i++) {
dp[0] = Math.max(dp[0],dp[1] + prices[i]);
dp[1] = Math.max(-prices[i],dp[1]);
}
return dp[0];
}
二、买卖股票的最佳时机II (LeetCode 122)
可以完成多次买卖,但是不能同时进行多笔交易,需要卖出后才能再次买入。
与上一题121相比,区别在于dp[i] [1] 受 dp[i-1] [0] 的影响,保证买入前先卖出
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][