第九章 动态规划part10
- 121. 买卖股票的最佳时机
// 解法1 class Solution { public int maxProfit(int[] prices) { if (prices == null || prices.length == 0) return 0; int length = prices.length; // dp[i][0]代表第i天持有股票的最大收益 // dp[i][1]代表第i天不持有股票的最大收益 int[][] dp = new int[length][2]; int result = 0; 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][0] + prices[i], dp[i - 1][1]); } return dp[length - 1][1]; } }
思路:该题可以使用贪心、暴力、动态规划解决,本解法使用动态规划,确定dp数组为二维数组,代表第i天持有和不持有股票的最大金额,确定递推公式,确定持有股票的递推公式和不持有股票的递推公式。
- 122.买卖股票的最佳时机II
// 动态规划 class Solution // 实现1:二维数组存储 // 可以将每天持有与否的情况分别用 dp[i][0] 和 dp[i][1] 来进行存储 // 时间复杂度:O(n),空间复杂度:O(n) public int maxProfit(int[] prices) { int n = prices.length; int[][] dp = new int[n][2]; // 创建二维数组存储状态 dp[0][0] = 0; // 初始状态 dp[0][1] = -prices[0]; for (int i = 1; i < n; ++i) { dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i]); // 第 i 天,没有股票 dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]); // 第 i 天,持有股票 } return dp[n - 1][0]; // 卖出股票收益高于持有股票收益,因此取[0] } }
思路:于上一题的区别就是本题可以多次买卖股票,dp数组、遍历顺序都一样,就是持有股票的递推公式发生了变化,当天i买股票的钱为前一天不持有股票的最大金额减去买股票的钱。