1

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,我不行了...官方别再这样了吧!小猪真的是不知道要写什么了,一滴都不剩了!!

希望能帮到有需要的小伙伴...如果觉得不错的话,记得『三连』哦。小猪爱你们哟~

相关链接

qrcode_green.jpeg


张小猪粉鼻子
2.9k 声望407 粉丝

一只粉色的小猪,喜欢写写代码,看看电影,玩玩游戏社恐,不太会讲话永远跟不上热点