leetcode top100挑战, 每天不鸽一道题之 买卖股票的最佳时机(15/100)

549 阅读2分钟

这是我参与更文挑战的第27天,活动详情查看: 更文挑战

题目描述

买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。

设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

leetcode-cn.com/problems/be…

示例 1:

输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0

标签

贪心算法

解题分析

1. 贪心算法

直接上讲解。

这道题其实很简单,想通一个逻辑就行。

开始遍历,我们保存价格最低的,
然后比较每天的最低价差值,如果差值更大,我们就保存更大的,直到最后 保存的都是利润最高的

来人上代码!!!!!

function maxProfit(prices: number[]): number {
  let min = prices[0];
  let max = 0;

  for(let i of prices) {
    const priceCount: number  = Number(i)

    if(!priceCount) continue;
    const price = prices[i]
    if(price - min > max) max = price - min
    if (price < min) min = price
  }
  return max

};

另外记一个厉害老哥的写法,学习学习。

var maxProfit = function(prices) {
    /* 
        思路四 极简版 一行代码 巧用reduce + [min, max] 本质上是思路三的一种简写方法 
        虽然 只有一行代码 但是 可读性 与 推展性 不高 生产环境的话还是推荐 思路三
        prices.reduce((p, v) => [
            Math.min(p[0], v), // 更新最小值 
            Math.max(p[1], v - p[0] ) // 更新最大值
        ], [Number.MAX_SAFE_INTEGER, 0])[1]
    */
    return prices.reduce((p, v) => [Math.min(p[0], v), Math.max(p[1], v - p[0]) ], [Number.MAX_SAFE_INTEGER, 0])[1]
}

最后

从今天开始不鸽,每天一道算法题并发布文章,首先想要解决的题组为Top100,第十五道题目打完收工!!