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; } }
加油,下一個變種困難的,= =。