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,我不行了...官方别再这样了吧!小猪真的是不知道要写什么了,一滴都不剩了!!
但愿能帮到有须要的小伙伴...若是以为不错的话,记得『三连』哦。小猪爱大家哟~