代码随想录算法训练营第四十九天 | 121. 买卖股票的最佳时机 & 122. 买卖股票的最佳时机 II

1. 买卖股票的最佳时机 

121. 买卖股票的最佳时机

只能买卖一次

class Solution {
    public int maxProfit(int[] prices) {
        int length = prices.length;
        // dp[i][0]代表第i天持有股票的最大收益
        // dp[i][1]代表第i天不持有股票的最大收益
        int[][] dp = new int[length][2];

        // 第一天
        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][1], dp[i-1][0] + prices[i]); // 卖,收入对应的钱
        }
        return dp[length - 1][1];
    }
}

2. 买卖股票的最佳时机 II​

122. 买卖股票的最佳时机 II

可以多次买卖

class Solution {
    public int maxProfit(int[] prices) {
        int length = prices.length;
        // dp[i][0]代表第i天持有股票的最大收益
        // dp[i][1]代表第i天不持有股票的最大收益
        int[][] dp = new int[length][2];

        // 第一天
        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], dp[i-1][1]-prices[i]);
            // 不持有 之前已经卖了,还是今天才卖(今天卖,则昨天已经持有了)
            dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]); // 卖,收入对应的钱
        }
        return dp[length - 1][1];
    }
}

你可能感兴趣的:(算法,leetcode,动态规划)