文章目录
- ● 121. 买卖股票的最佳时机
- 思路一:贪心(效率最快)
- 代码:
- 思路二:动态规划-dp数组
- 代码:
- 思路三:动态规划 常数储存
- 代码:
- ● 122.买卖股票的最佳时机II
- 思路一:动态规划二维数组
- 代码:
- 思路二:动态规划常量
- 代码:
- 思路三:贪心
- 代码:
● 121. 买卖股票的最佳时机
思路一:贪心(效率最快)
因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。
代码:
class Solution {public int maxProfit(int[] prices) {// 找到一个最小的购入点int low = Integer.MAX_VALUE;// res不断更新,直到数组循环完毕int res = 0;for(int i = 0; i < prices.length; i++){low = Math.min(prices[i], low);res = Math.max(prices[i] - low, res);}return res;}
思路二:动态规划-dp数组
dp[i][0] 持有股票的最多现金
dp[i][0]=Math.max(dp[i-1][0],-prices[i])
dp[i][1] 不持有股票的最多现金
dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i])
代码:
class Solution {public int maxProfit(int[] prices) {int n=prices.length;int[][] dp=new int[n][2];// 0持有股票 1不持有股票的现金dp[0][0]=-prices[0];dp[0][1]=0;for(int i=1;i<n;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[n-1][1];}
}
思路三:动态规划 常数储存
代码:
class Solution {public int maxProfit(int[] prices) {int n=prices.length;int[] dp=new int[2];// 0持有股票 1不持有股票的现金dp[0]=-prices[0];dp[1]=0;for(int i=1;i<n;i++){int a=dp[0];dp[0]=Math.max(a,-prices[i]);dp[1]=Math.max(dp[1],a+prices[i]);}return dp[1];}
}
● 122.买卖股票的最佳时机II
思路一:动态规划二维数组
代码:
class Solution {public int maxProfit(int[] prices) {int[][] dp=new int[prices.length][2];// 0持有 1不持有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][1],dp[i-1][0]+prices[i]);}return dp[prices.length-1][1];}
}
思路二:动态规划常量
疑惑:为什么dp[1]和dp[0]更新了仍然不受影响?
代码:
// 优化空间
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];}
}
思路三:贪心
递增(i>i-1)则代表可以在后面继续抛售,新的购入也是递增,则res前后两个区间都可以相加
代码:
// 贪心思路
class Solution {public int maxProfit(int[] prices) {int result = 0;for (int i = 1; i < prices.length; i++) {result += Math.max(prices[i] - prices[i - 1], 0);}return result;}
}