[寶寶也能看懂的活動篇][30-Day LeetCoding Challenge] 第五天

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,我不行了...官方別再這樣了吧!小豬真的是不知道要寫什麼了,一滴都不剩了!!

但願能幫到有須要的小夥伴...若是以爲不錯的話,記得『三連』哦。小豬愛大家喲~

相關連接

qrcode_green.jpeg

相關文章
相關標籤/搜索