【演算法】【線性表】【陣列】買賣股票的最佳時機 II

酷酷-發表於2024-09-15

1 題目

給你一個整數陣列 prices ,其中 prices[i] 表示某支股票第 i 天的價格。

在每一天,你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買,然後在同一天 出售。

返回 你能獲得的最大利潤 。

示例 1:

輸入:prices = [7,1,5,3,6,4]
輸出:7
解釋:在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5 - 1 = 4。
隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6 - 3 = 3。
最大總利潤為 4 + 3 = 7 。

示例 2:

輸入:prices = [1,2,3,4,5]
輸出:4
解釋:在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5 - 1 = 4。
最大總利潤為 4 。

示例 3:

輸入:prices = [7,6,4,3,1]
輸出:0
解釋:在這種情況下, 交易無法獲得正利潤,所以不參與交易可以獲得最大利潤,最大利潤為 0。

提示:

  • 1 <= prices.length <= 3 * 104
  • 0 <= prices[i] <= 104

2 解答

這個題你要是能想清楚,就是看陣列中有多少個升序陣列,並把每個升序陣列的最大減去最小的和加起來,就是這個題的解,是不是把這個題換成這種描述你就會了,關鍵是怎麼想到這裡,它是上一個題的變種,上一個題只能買賣一次,這個題是能買賣多次了,買賣之間不相交:

class Solution {
    public int maxProfit(int[] prices) {
        // 儲存結果
        int res = 0;
        if (prices == null || prices.length <= 1) {
            return res;
        }
        // 我這裡用的倒序 升序也可以
        for (int i = prices.length - 1; i >= 0; i--) {
            int current = prices[i];
            // 從當前位置往前找
            // 直到找到一個比他大的
            int j = i - 1;
            for (; j >= 0; j--) {
                if (prices[j] <= prices[j + 1]) {
                    continue;
                }
                // 找到比他大的退出 說明是一組升序陣列了
                break;
            }
            // 計算一下這組的收益 就是最大的 減去最小的
            int minus = current - prices[j + 1];
            // 有收益的化 就加上
            if (minus > 0) {
                res += minus;
            }
            i = j + 1;
        }
        return res;
    }
}

加油,下一個變種困難的,= =。

相關文章