觀前提醒:
Say you have an array for which the ith element is the price of a given stock on day i.
If you were only permitted to complete at most one transaction (i.e., buy one and sell one share of the stock), design an algorithm to find the maximum profit.
Note that you cannot sell a stock before you buy one.
Example 1:
Input: [7,1,5,3,6,4]
Output: 5
Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
Not 7-1 = 6, as selling price needs to be larger than buying price.
Example 2:
Input: [7,6,4,3,1]
Output: 0
Explanation: In this case, no transaction is done, i.e. max profit = 0.
這題其實相當的有意思,他有點像 Maximum Subarray的顛倒版,我們先以上方 Example 2 為例子,陣列為 [7, 1, 5, 3, 6, 4],故圖示如下:
(來源:LeetCode)
從上圖來看,我們需要在最低的谷之後找到最高的峰,
這樣就能滿足題目的要求。
我們簡單拆成以下步驟執行此策略:
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function (prices) {
let minPrice = Number.MAX_SAFE_INTEGER;
let maxMoney = 0;
for (let i = 0; i < prices.length; i++) {
if (prices[i] < minPrice) {
minPrice = prices[i];
} else if (prices[i] - minPrice > maxMoney) {
maxMoney = prices[i] - minPrice;
}
}
return maxMoney;
};
這題也是不太困難,只需要多加留意題目的特性,再搭配 Dynamic programming概念來思考,這題應該不會很難解出來才是~
謝謝大家的收看,LeetCode 小學堂我們下次見~