目录
- [题目1: 121. 买卖股票的最佳时机](#题目1: 121. 买卖股票的最佳时机)
-
- [1- 思路](#1- 思路)
- [2- 题解](#2- 题解)
- [题目2: 122. 买卖股票的最佳时机 II](#题目2: 122. 买卖股票的最佳时机 II)
-
- [1- 思路](#1- 思路)
- [2- 题解](#2- 题解)
题目1: 121. 买卖股票的最佳时机
- 题目链接:121. 买卖股票的最佳时机
1- 思路
动规五部曲
- 1. 确定 dp 数组含义
- int[][] dp = new int[prices.length][2];
- 根据 prices 的输入,其主要有两个维度
- dp[i][0] 代表第 i 天持有股票的最大收益
- dp[i][1] 代表第 i 天不持有股票的最大收益
- 2. 确定递推公式
dp[i][0]
也就是当天有股票,取决于 前一天有股票 dp[i][0] = Math.max(dp[i-1][0],-dp[])- 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
- 第i天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i]
- 如果第i天不持有股票即dp[i][1], 也可以由两个状态推出来
- 第
i-1
天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
- 第
i
天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]
- 第
- 3. dp 数组初始化
dp[0][0]
代表第一天持有,只能是第一天买dp[0][0] = -nums[0]
dp[0][1]
代表第一天没有,则dp[0][1] = 0
- 4. 遍历顺序
i
从1
遍历到nums.length()
2- 题解
⭐买卖股票的最佳时机------题解思路
java
class Solution {
public int maxProfit(int[] prices) {
//1. 定义 dp 数组
//dp[i][0] 代表 第 i 天持有股票的金额
//dp[][0] 代表第 i 天不持有
int[][] dp = new int[prices.length][2];
//2. 递推公式
// 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]);
//3. 初始化
// 第 0 天持有,买
dp[0][0] = -prices[0];
// 第 0 天没有
dp[0][1] = 0;
// 4. 遍历
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[prices.length-1][1];
}
}
题目2: 122. 买卖股票的最佳时机 II
- 题目链接:122. 买卖股票的最佳时机 II
1- 思路
动规五部曲
- 1. 确定 dp 数组含义
- dp[i][0] 表示第i天持有股票所得现金。
- dp[i][1] 表示第i天不持有股票所得最多现金
- 2. 确定递推公式
- 如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来
- 第
i-1
天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
- 第
i
天买入股票,所得现金就是昨天不持有股票的所得现金减去 今天的股票价格 即:dp[i - 1][1] - prices[i]
- 第
- 再来看看如果第
i
天不持有股票即dp[i][1]
的情况, 依然可以由两个状态推出来- 第
i-1
天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
- 第
i
天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]
- 第
- 如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来
- 3. dp 数组初始化
- dp[0][0] = -prices[0];
- dp[0][1] = 0;
- 4. 遍历顺序
i
从1
遍历到nums.length()
2- 题解
⭐买卖股票的最佳时机------题解思路
java
class Solution {
public int maxProfit(int[] prices) {
// 1. 定义dp数组
int[][] dp = new int[prices.length][2];
// 2. 递推公式
// dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]-prices[i]);
// dp[i][0] = Math.max(dp[i-1][1],dp[i-1][1]+prices[i]);
//3. 初始化
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[prices.length-1][1];
}
}