代码随想录训练营 买卖股票问题合集
文章目录
1.买卖股票的最佳时机
1.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];
}
}
2.买卖股票的最佳时机Ⅱ
2.1思路及详细代码
class Solution {
public int maxProfit(int[] prices) {
int[] dp = new int[2];
// 0表示持有,1表示卖出
dp[0] = -prices[0];
dp[1] = 0;
for(int i = 1; i <= prices.length; i++){
// 前一天持有; 既然不限制交易次数,那么再次买股票时,要加上之前的收益
dp[0] = Math.max(dp[0], dp[1] - prices[i-1]);
// 前一天卖出; 或当天卖出,当天卖出,得先持有
dp[1] = Math.max(dp[1], dp[0] + prices[i-1]);
}
return dp[1];
}
}
3.买卖股票的最佳时机Ⅲ
3.1思路及详细代码
class Solution {
public int maxProfit(int[] prices) {
int[] dp=new int[4];
//第一天买入
dp[0]=-prices[0];
//第二天卖出
dp[2]=-prices[0];
for(int i=1;i<prices.length;i++){
dp[0]=Math.max(dp[0],-prices[i]);
dp[1]=Math.max(dp[1],dp[0]+prices[i]);
dp[2]=Math.max(dp[2],dp[1]-prices[i]);
dp[3]=Math.max(dp[3],dp[2]+prices[i]);
}
return dp[3];
}
}
4.买卖股票的最佳时机Ⅳ
4.1思路及详细代码
class Solution {
public int maxProfit(int k, int[] prices) {
if(k==0||prices.length==0) return 0;
int[] dp=new int[k*2];
//第一天买入
// dp[0]=-prices[0];
// //第二天买入
// dp[2]=-prices[0];
for(int i=0;i<k*2;i=i+2){
dp[i]=-prices[0];
}
for(int i=1;i<prices.length;i++){
dp[0]=Math.max(dp[0],-prices[i]);
dp[1]=Math.max(dp[1],dp[0]+prices[i]);
for(int j=2;j<k*2;j++){
if(j%2==0){
dp[j]=Math.max(dp[j],dp[j-1]-prices[i]);
}else if(j%2!=0){
dp[j]=Math.max(dp[j],dp[j-1]+prices[i]);
}
}
}
return dp[k*2-1];
}
}
5.买卖股票的最佳时机含冷冻期
5.1思路及详细代码
class Solution {
public int maxProfit(int[] prices) {
int[][] dp = new int[prices.length + 1][2];
dp[1][0] = -prices[0];
for (int i = 2; i <= prices.length; i++) {
/*
dp[i][0] 第i天持有股票收益;
dp[i][1] 第i天不持有股票收益;
情况一:第i天是冷静期,不能以dp[i-1][1]购买股票,所以以dp[i - 2][1]买股票,没问题
情况二:第i天不是冷静期,理论上应该以dp[i-1][1]购买股票,但是第i天不是冷静期说明,第i-1天没有卖出股票,
则dp[i-1][1]=dp[i-2][1],所以可以用dp[i-2][1]买股票,没问题
*/
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 2][1] - prices[i - 1]);
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i - 1]);
}
return dp[prices.length][1];
}
}
6.买卖股票的最佳时机含手续费
6.1思路及详细代码
class Solution {
public int maxProfit(int[] prices, int fee) {
int[] dp = new int[2];
dp[0] = -prices[0];
dp[1] = 0;
for (int i = 1; i <= prices.length; i++) {
dp[0] = Math.max(dp[0], dp[1] - prices[i - 1]);
dp[1] = Math.max(dp[1], dp[0] + prices[i - 1] - fee);
}
return dp[1];
}
}