Hi 大家好,我是张小猪。欢迎来到『宝宝也能看懂』系列特别篇 - 30-Day LeetCoding Challenge。
这是一个 leetcode 官方的小活动。可以在官网看到,从 4 月 1 号开始,每天官方会选出一道题,在 24 小时内完成即可获得一点小奖励。虽然奖励似乎也没什么用,不过作为一个官方的打卡活动,小猪还是来打一下卡吧,正好作为每天下班回家后的娱乐。
这里是 4 月 5 号的题,也是题目列表中的第 122 题 -- 『买卖股票的最佳时机 II』
题目描述
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [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:
输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
官方难度
EASY
解决思路
由于买入和卖出的执行次数没有任何要求,并且我们拥有整个时间段的价格数据,所以并没有什么需要分析的,我们的最优策略非常直接 -- 高抛低吸。
直接方案
把价格点的连线想象成一条折现,我们只需要取所有斜率为正的线段区间的价格差进行求和即可。具体代码如下:
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,我不行了...官方别再这样了吧!小猪真的是不知道要写什么了,一滴都不剩了!!
希望能帮到有需要的小伙伴...如果觉得不错的话,记得『三连』哦。小猪爱你们哟~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。