文章目录
- ● 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;
}
}