赞
踩
代码随想录训练营 买卖股票问题合集
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]; } }
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];
}
}
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]; } }
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]; } }
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]; } }
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];
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。