LeetCode 121 买卖股票的最佳时机
题目链接:121. 买卖股票的最佳时机 - 力扣(LeetCode)
【解题思路】
-
1.确定dp数组含义
-
dp[i][0]表示第i天持有股票所得到的最大现金
-
dp[i][1]表示第i天不持有股票所得到的最大现金
-
求的结果是dp[len-1][0]和dp[len-1][1]中的最大值
-
-
2.确定递推公式
-
第i天持有股票
-
dp[i][0] = max(dp[i-1][0],-price[i])
-
第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
-
第i天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i]
-
-
-
第i天不持有股票
-
dp[i][1] = max(dp[i-1][1],price[i]+dp[i-1][0])
-
第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
-
第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]
-
-
-
-
3.初始化dp数组
-
dp[0][0]= -price[0]
-
表示第一天买入股票(持有股票)
-
-
dp[0][1] = 0
-
表示第一天不买入股票(不持有股票)
-
-
-
4.确定遍历顺序
-
从递推公式可以看出dp[i]都是由dp[i-1]推导出来,所以一定是从前向后遍历
-
-
5.举例推导dp数组
【解题步骤】
-
1.如果prices为空或者prices长度为0,直接返回0
-
2.新建一个二维dp数组,长度为price的长度和2
-
3.初始化dp[0][0]=-prices[0];dp[0][1]=0
-
4.从前往后遍历数组
-
递推公式
-
-
5.返回dp[length-1][1]
【代码部分】
class Solution {
public int maxProfit(int[] prices) {
if(prices == null || prices.length == 0)return 0;
int [][] dp = new int[prices.length][2];
dp[0][0]=-prices[0];
dp[0][1]=0;
for(int i = 1 ; i < dp.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];
}
}
LeetCode 122 买卖股票的最佳时机II
题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)
【解题思路】
-
1.确定dp数组含义
-
dp[i][0]表示第i天持有股票所得到的最大现金
-
dp[i][1]表示第i天不持有股票所得到的最大现金
-
求的结果是dp[len-1][0]和dp[len-1][1]中的最大值
-
-
2.确定递推公式
-
第i天持有股票
-
dp[i][0] = max(dp[i-1][0],dp[i-1][1]-price[i])
-
第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
-
第i天买入股票,所得现金就是买入今天的股票后所得现金即:dp[i-1][1]-prices[i]
-
跟上一题唯一的区别就是可以买入多次,所以是前一天没有股票的现金减去买股票花的钱
-
-
-
-
第i天不持有股票
-
dp[i][1] = max(dp[i-1][1],price[i]+dp[i-1][0])
-
第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
-
第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]
-
-
-
-
3.初始化dp数组
-
dp[0][0]= -price[0]
-
表示第一天买入股票(持有股票)
-
-
dp[0][1] = 0
-
表示第一天不买入股票(不持有股票)
-
-
-
4.确定遍历顺序
-
从递推公式可以看出dp[i]都是由dp[i-1]推导出来,所以一定是从前向后遍历
-
-
5.举例推导dp数组
【解题步骤】
-
1.如果prices为空或者prices长度为0,直接返回0
-
2.新建一个二维dp数组,长度为price的长度和2
-
3.初始化dp[0][0]=-prices[0];dp[0][1]=0
-
4.从前往后遍历数组
-
递推公式
-
-
5.返回dp[length-1][1]
【代码部分】
class Solution {
public int maxProfit(int[] prices) {
if(prices == null || prices.length == 0)return 0;
int [][] dp = new int[prices.length][2];
dp[0][0]=-prices[0];
dp[0][1]=0;
for(int i = 1 ; i < dp.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];
}
}