123.买卖股票的最佳时机II
- 原题链接:
- 完成情况:
- 参考代码:
- _122买卖股票的最佳时机II_可以多次买入卖出01
- _122买卖股票的最佳时机II_可以多次买入卖出02
- _122买卖股票的最佳时机II_常规dp
- _122买卖股票的最佳时机II_一维dp
- _122买卖股票的最佳时机II_滚动数组
- 错误经验吸取
原题链接:
123.买卖股票的最佳时机II
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/
完成情况:
参考代码:
_122买卖股票的最佳时机II_可以多次买入卖出01
package 代码随想录.动态规划;public class _122买卖股票的最佳时机II_可以多次买入卖出01 {public int maxProfit(int[] prices) {//贪心递推过去int len = prices.length;if (len < 2){return 0;}int res = 0;for (int i = 1; i < len; i++){int difference = prices[i] - prices[i - 1];//只要能赚就进货,//你也可以先购买,然后在 同一天 出售。if (difference > 0){res += difference;}}return res;}
}
_122买卖股票的最佳时机II_可以多次买入卖出02
package 代码随想录.动态规划;public class _122买卖股票的最佳时机II_可以多次买入卖出02{public int maxProfit(int[] prices) {//贪心递推过去int len = prices.length;if (len < 2){return 0;}int res = 0;for (int i = 1; i < len; i++){res += Math.max(prices[i] - prices[i-1],0);}return res;}}
_122买卖股票的最佳时机II_常规dp
package 代码随想录.动态规划;public class _122买卖股票的最佳时机II_常规dp {/**** @param prices* @return*/public int maxProfit(int[] prices) {int len = prices.length;if (len < 2){return 0;}//0:持有现金//1:持有股票//状态转移 0-> 1-> 0 -> 1-> 0 -> 1-> 0int dp [][] = new int[len][2];dp[0][0] = 0;dp[0][1] = -prices[0];//递推数组for (int i = 1; i < len; i++){//给dp每一组的两个变量赋值进去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[len - 1][0];}
}
_122买卖股票的最佳时机II_一维dp
package 代码随想录.动态规划;public class _122买卖股票的最佳时机II_一维dp {/**** @param prices* @return*/public int maxProfit(int[] prices) {int len = prices.length;if(len < 2) return 0;//cash: 现金//hold: 持有股票//状态数组//状态转移:int [] cash = new int[len];int [] hold = new int[len];cash[0] =0;hold[0] = -prices[0];for (int i = 1;i<len;i++){//这两行调换顺序也是可以的cash[i] = Math.max(cash[i-1],hold[i-1] + prices[i]);hold[i] = Math.max(hold[i-1],cash[i-1] - prices[i]);}return cash[len- 1 ];}
}
_122买卖股票的最佳时机II_滚动数组
package 代码随想录.动态规划;public class _122买卖股票的最佳时机II_滚动数组 {/**** @param prices* @return*/public int maxProfit(int[] prices) {int len = prices.length;if (len < 2) return 0;int cash = 0;int hold = -prices[0];int preCash = cash;int preHold = hold;for (int i = 1; i < len; i++) {cash = Math.max(preCash,preHold + prices[i]);hold = Math.max(preHold,preCash - prices[i]);preCash = cash;preHold = hold;}return cash;}
}