1. 程式人生 > 其它 >【LeetCode】309. Best Time to Buy and Sell Stock with Cooldown 最佳買賣股票時機含冷凍期(Medium)(JAVA)

【LeetCode】309. Best Time to Buy and Sell Stock with Cooldown 最佳買賣股票時機含冷凍期(Medium)(JAVA)

技術標籤:Leetcodeleetcode演算法java面試資料結構

【LeetCode】309. Best Time to Buy and Sell Stock with Cooldown 最佳買賣股票時機含冷凍期(Medium)(JAVA)

題目地址: https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/

題目描述:

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times) with the following restrictions:

  • You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
  • After you sell your stock, you cannot buy stock on next day. (ie, cooldown 1 day)

Example:

Input: [1,2,3,0,2]
Output: 3 
Explanation: transactions = [buy, sell, cooldown, buy, sell]

題目大意

給定一個整數陣列,其中第i個元素代表了第i天的股票價格 。​

設計一個演算法計算出最大利潤。在滿足以下約束條件下,你可以儘可能地完成更多的交易(多次買賣一支股票):

  • 你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
  • 賣出股票後,你無法在第二天買入股票 (即冷凍期為 1 天)。

解題方法

  1. 分為兩種狀態: 當前未持有股票的最大值,當前未持有股票的最大值
  2. 假設 dp[i] 之前的狀態都是已知的,求出 dp[i][0] 和 dp[i][1]
  3. 當前持有股票 dp[i][0]:可能是上一次就持有了股票 dp[i - 1][0] ,也可能是當前才持有股票(因為有冷卻時間,只能隔一個的最大值 - prices[i]) 也就是 dp[i - 2] - prices[i])),求出這兩種情況的最大值
  4. 當前不持有股票 dp[i][1]:可能是當前這一次賣出去了 dp[i - 1][0] + prices[i](上一次必須持有股票才能賣),可能是當前啥也沒操作 dp[i - 1][1],求出這兩種情況的最大值
class Solution {
    public int maxProfit(int[] prices) {
        // dp[i][0]: has stock; dp[i][1]: no stock
        if (prices.length <= 1) return 0;
        int[][] dp = new int[prices.length][2];
        dp[0][0] = -prices[0];
        for (int i = 1; i < prices.length; i++) {
            dp[i][0] = Math.max(dp[i - 1][0], dp[Math.max(0, i - 2)][1] - prices[i]);
            dp[i][1] = Math.max(dp[i - 1][0] + prices[i], dp[i - 1][1]);
        }
        return dp[prices.length - 1][1];
    }
}

執行耗時:1 ms,擊敗了99.38% 的Java使用者
記憶體消耗:37.8 MB,擊敗了41.28% 的Java使用者

歡迎關注我的公眾號,LeetCode 每日一題更新