每日一算,买卖股票的最佳时机(贪心算法)

440 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

今天有人问到笔试碰到一道题:数组中从右减左求最大差值,我想到力扣有一道比较经典的题:买卖股票的最佳时机

1111.png

这题比较简单,主要是能通过这道题逐渐了解动态规划、贪心算法等技巧

官方已经有很多题解,所以主要是提供做题的思路,从123到通过题解到最后如何优化来实现

先初步通过,再优化,首先有个思路

  1. 默认一个最小值,最大值,利润
  2. 通过遍历进行判断,更新最小值,最大值,利润
  3. 遍历完成后返回最终结果
/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function (prices) {
    // 默认一个最小值,最大值,利润
    // 先定义第一天,循环中逐步对比
    let min = prices[0]
    let max = prices[0]
    let res = 0
    // 通过遍历进行判断,更新最小值,最大值,利润
    for (let i = 1; i < prices.length; i++) {
        if (min >= prices[i]) {
            min = prices[i]
            max = prices[i]
        }
        if(max <= prices[i]){
            max = prices[i]
        }
        res = res > max-min ? res : max-min
    }
    // 遍历完成后返回最终结果
    return res
};

这样是可以通过的,但是代码不够优雅,还可以继续优化

这里我是在遍历中通过max-min获取结果并更新,但其实可以直接用利润来计算

  1. 首先把max去掉,这里不用了
  2. 然后利用Math函数把第一个 if判断和内容更换成min = Math.min(min, prices[i]),逻辑同理
  3. 再把第二个 if判断和内容更换成res = Math.max(res, prices[i] - min),逻辑同理
  4. 去掉res = res > max-min ? res : max-min
  5. 最后返回结果
/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function (prices) {
    // 默认一个最小值,利润
    // 先定义第一天,循环中逐步对比
    let min = prices[0]
    let res = 0
    // 通过遍历进行判断,更新最小值,利润
    for (let i = 1; i < prices.length; i++) {
        min = Math.min(min, prices[i])
        res = Math.max(res, prices[i] - min)
    }
    // 遍历完成后返回最终结果
    return res
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)