Hi 你們好,我是張小豬。歡迎來到『寶寶也能看懂』系列特別篇 - 30-Day LeetCoding Challenge。git
這是一個 leetcode 官方的小活動。能夠在官網看到,從 4 月 1 號開始,天天官方會選出一道題,在 24 小時內完成便可得到一點小獎勵。雖然獎勵彷佛也沒什麼用,不過做爲一個官方的打卡活動,小豬仍是來打一下卡吧,正好做爲天天下班回家後的娛樂。github
這裏是 4 月 5 號的題,也是題目列表中的第 122 題 -- 『買賣股票的最佳時機 II』算法
給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。shell
設計一個算法來計算你所能獲取的最大利潤。你能夠儘量地完成更多的交易(屢次買賣一支股票)。segmentfault
注意:你不能同時參與多筆交易(你必須在再次購買前出售掉以前的股票)。數組
示例 1:spa
輸入: [7,1,5,3,6,4] 輸出: 7 解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能得到利潤 = 5-1 = 4 。 隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能得到利潤 = 6-3 = 3 。
示例 2:設計
輸入: [1,2,3,4,5] 輸出: 4 解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能得到利潤 = 5-1 = 4 。 注意你不能在第 1 天和第 2 天接連購買股票,以後再將它們賣出。 由於這樣屬於同時參與了多筆交易,你必須在再次購買前出售掉以前的股票。
示例 3:code
輸入: [7,6,4,3,1] 輸出: 0 解釋: 在這種狀況下, 沒有交易完成, 因此最大利潤爲 0。
EASYblog
因爲買入和賣出的執行次數沒有任何要求,而且咱們擁有整個時間段的價格數據,因此並無什麼須要分析的,咱們的最優策略很是直接 -- 高拋低吸。
把價格點的連線想象成一條折現,咱們只須要取全部斜率爲正的線段區間的價格差進行求和便可。具體代碼以下:
const maxProfit = prices => { let profit = 0; for (let i = 1; i < prices.length; ++i) { const val = prices[i] - prices[i - 1]; val > 0 && (profit += val); } return profit; };
固然,咱們也能夠直接寫成一行:
const maxProfit = prices => prices.reduce((prev, cur, curIdx) => cur - prices[curIdx - 1] > 0 ? prev + cur - prices[curIdx - 1] : prev, 0);
做爲『30-Day LeetCoding Challenge』的第五題...ahhhh,我不行了...官方別再這樣了吧!小豬真的是不知道要寫什麼了,一滴都不剩了!!
但願能幫到有須要的小夥伴...若是以爲不錯的話,記得『三連』哦。小豬愛大家喲~