代码随想录刷题记录 day43 股票买卖的最佳时机1 2
参考:代码随想录
121. 买卖股票的最佳时机
思想
-
dp数组定义
dp[i][0]表示 第i天 持有股票 手头的最大的现金数为dp[i][0]
dp[i][1]表示 第i天 不持有股票 手头的最大的现金数为dp[i][1]
-
递推公式
dp[i][0]= dp[i-1][0] :第i-1天持有 , -prices[i] :第i-1天不持有,第i天持有了 表示买入了股票。因为本题股票只能买卖一次,所以是-prices[i]
dp[i][1]=Math.max(dp[i-1][0]+prices[i] :i-1天持有,i天不持有 表示卖出,dp[i-1][1]:i-1天不持有,i天也不持有)
-
初始化
dp[0][0]=-prices[0];
dp[0][1]=0;
-
遍历顺序,依靠之前的状态
-
打印数组
代码
class Solution {
public int maxProfit(int[] prices) {
//dp[i][0]表示 第i天 持有股票 手头的最大的现金数为dp[i][0]
//dp[i][1]表示 第i天 不持有股票 手头的最大的现金数为dp[i][1]
//dp[i][0]= dp[i-1][0] 第i-1天持有 -prices[i] 第i-1天不持有,第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])
//初始化
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][0]+prices[i], dp[i-1][1]);
}
return dp[prices.length-1][1];
}
}
122. 买卖股票的最佳时机 II
思想
1.贪心
2.动态规划
和上一题的区别就是可以多次买卖,所以dp[i][0]=max(dp[i-1][0], dp[i-1][1]-prices[i])
代码
class Solution {
// public int maxProfit(int[] prices) {
// //只要第二天的利润为正的 就卖出股票
// int res=0;
// for(int i=1;i<prices.length;i++){
// if(prices[i]>prices[i-1]){
// res+=prices[i]-prices[i-1];
// }
// }
// return res;
// }
public int maxProfit(int[] prices){
//dp[i][0]表示第i天 持有股票 手上的最大的现金
//dp[i][1]表示第i天 不持有股票 手上的最大的现金
//dp[i][0]:
//i-1天持有,i天还持有 dp[i][0]=dp[i-1][0]
//i-1天不持有 i天持有 说明在第i天买入了 dp[i][0]=dp[i-1][1]-prices[i] 和上一题不同的是可能这里有利润,会有剩余
//dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]-prices[i])
//dp[i][1]
//i-1天持有,第i天不持有,表示卖出股票 dp[i][1]=dp[i-1][0]+prices[i]
//i-1天不持有 第i天也不持有 dp[i][1]=dp[i-1][1]
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],dp[i-1][1]-prices[i]);
dp[i][1]=Math.max(dp[i-1][0]+prices[i], dp[i-1][1]);
}
return dp[prices.length-1][1];
}
}