代码随想录-2023/08/15

86 阅读2分钟

动态规划 --- 买卖股票问题

121.买卖股票的最佳时机

解题思路:

  1. 只能买卖一次 --- 每个位置两个状态
  2. dp数组含义: 当前位置持有股票 | 未持有股票的状态
  3. 持有:可以是延续之前持有的状态, 也可以是今天买入
  4. 未持有: 可以是延续之前未持有的状态, 也可以是今天卖出

代码:

class Solution {
    // 只能买卖一次
    public int maxProfit(int[] prices) {
        int n = prices.length;
        // 动态规划
        // 第一次持有股票的最大价值
        // 第一次未持有股票的最大价值
        int[][] dp = new int[n + 1][2];
        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];
    }
}

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

解题思路:

动态规划

  1. 定义dp数组含义:持有和未持有的状态
  2. 与121题目不同的是,
  • 本题要求持有的状态可以是继续持有, 也可以是今天买入, 但是今天买入一定是在之前未持有的状态
  • 本题要求未持有的状态可以是继续未持有, 也可以是今天卖出, 但是今天卖出一定是在之前持有的状态

代码:

class Solution {
    // 可以买卖多次 --- 最多只能持有一只股票
    public int maxProfit(int[] prices) {
        int n = prices.length;
        int[][] dp = new int[n][2];
        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[n-1][1];
    }
}