121. 买卖股票的最佳时机
class Solution {
public int maxProfit(int[] prices) {
//1、定义dp数组,表示第i天持股票的状态dp[i][0]表示持有股票dp[i][1]表示不持有股票
int[][] dp=new int[prices.length][2];
//3、初始化数组
dp[0][1]=0;
dp[0][0]=-prices[0];
//4、遍历顺序,从小到大
for(int i=1;i<prices.length;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[prices.length-1][1];
}
}
时间复杂度:O(n)
空间复杂度:O(n)
122.买卖股票的最佳时机II
大家可以本题和 121. 买卖股票的最佳时机 的代码几乎一样,唯一的区别在:
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
这正是因为本题的股票可以买卖多次! 所以买入股票的时候,可能会有之前买卖的利润即:dp[i - 1][1],所以dp[i - 1][1] - prices[i]。
方法一、贪心解法
class Solution {
public int maxProfit(int[] prices) {
int sum=0;
for(int i=1;i<prices.length;i++){
if(prices[i]-prices[i-1]>0){
sum+=prices[i]-prices[i-1];
}
}
return sum;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
方法二、动态规划
class Solution {
public int maxProfit(int[] prices) {
//1、定义dp数组,表示第i天持股票的状态dp[i][0]表示持有股票dp[i][1]表示不持有股票
int[][] dp=new int[prices.length][2];
//3、初始化数组
dp[0][1]=0;
dp[0][0]=-prices[0];
//4、遍历顺序,从小到大
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];//最后卖出肯定比持有要获得更大利润
}
}
时间复杂度:O(n)
空间复杂度:O(n)