leetcode-zgd-day49-121.买卖股票的最佳时机/122.买卖股票的最佳时机II

99 阅读2分钟

121.买卖股票的最佳时机

题目链接:121. 买卖股票的最佳时机 - 力扣(Leetcode)

解题思路:

可以将所有情况根据卖出股票的日子分成多种情况。用for循环来模拟这个过程。for循环中的变量代表股票卖出日志的索引下标。那么买入的日子自然就是在卖出日子之前所有日子中股票票价最低的一天。用一个变量来更新记录过去的日子中股票的最低价。

毕竟这个题目只能买卖一次,思路就变得清晰了。

 class Solution {
     public int maxProfit(int[] prices) {
         /**
          * 其实就是需要记录一下当前结束点之前的子数组中的最小值
          * 根据这个最小值和当前结束点,来计算最大利润
          */
         int maxMoney = 0;
         if(prices.length == 1) return 0;
         int minPrice = prices[0];
         for(int i = 1; i < prices.length; i++){
             maxMoney = Math.max(maxMoney, prices[i] - minPrice);
             minPrice = Math.min(minPrice, prices[i]);
         }
         return maxMoney;
     }
 }

动态规划法:

多加了一个维度,用来记录当前所处的状态,是持有股票状态1,还是未持有股票状态0

 class Solution {
     public int maxProfit(int[] prices) {
         /**
          * 1.
          * dp[i][j] 前i天能够获得的最大利润 j 0 未持有股票 1 持有股票
          * dp[i][0] 第i天未持有股票情况下前i天能够获得的最大利润: 1.第i天卖的 2.i-1天也没持有
          * dp[i][1] 第i天持有股票情况下前i天能够获得的最大利润: 1.第i天买的 2.i-1天就买了
          * 2.
          * dp[i][0] = Math.max(dp[i - 1][1] + prices[i], dp[i - 1][0]);
          * dp[i][1] = Math.max(- prices[i], dp[i - 1][1]);
          * 3.
          * dp[0][0] = 0
          * dp[0][1] = -prices[0]
          * 4.正向循环递推
          */
         int[][] dp = new int[prices.length][2];
         dp[0][0] = 0;
         dp[0][1] = -prices[0];
         for(int i = 1; i < prices.length; i++){
             dp[i][0] = Math.max(dp[i - 1][1] + prices[i], dp[i - 1][0]);
             dp[i][1] = Math.max(- prices[i], dp[i - 1][1]);
         }
         return dp[prices.length - 1][0];
     }
 }

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

题目链接:122. 买卖股票的最佳时机 II - 力扣(Leetcode)

解题思路:

贪心,贪当前的最大利润,就是总的最大利润,因为可以同一天买入卖出。

 class Solution {
     public int maxProfit(int[] prices) {
         int ans = 0;
         for(int i = 0; i < prices.length - 1; i++){
             ans += Math.max(0, prices[i + 1] - prices[i]);
         }
         return ans;
     }
 }

动态规划法:

思路基本和买卖股票最佳状态I是一样的,就是递推关系式不同。

 class Solution {
     public int maxProfit(int[] prices) {
         /**
          * 动态规划解法
          * 1.dp[i][j] j 0 未持有股票 1 持有股票
          * dp[i][0] 未持有股票情况下最大利润
          * dp[i][1] 持有股票情况下最大利润
          * 2.
          * 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]);
          * 3.
          * dp[0][0] = 0;
          * dp[0][1] = -prices[0];
          */
         int[][] dp = new int[prices.length][2];
         dp[0][0] = 0;
         dp[0][1] = -prices[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][0];
     }
 }