返回

剑指Offer——股票的最大利润(JS实现) |刷题打卡

前端

前言
掘金团队号上线,助你 Offer 临门!点击查看详情

题目

给定一个数组prices,其中prices[i]表示第i天股票的价格。

在一个交易日,您可以完成最多一笔交易(即买入和卖出股票一次)。设计一个算法来计算您所能获得的最大利润。

注意:您不能在买入股票前卖出股票。

示例1:

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

示例2:

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

解题思路

首先定义一个数组来存储当天之后股票的价格-今天的价格的最大值。

遍历每一个元素的同时,取出剩余元素使用JS自带的sort方法,将元素按照升序排列,最后计算出第一个元素和最后一个元素之差就是当天之后股票价格-今天的价格的最大值,将它存储到数组中。

遍历完所有元素后,数组中的每一个元素都代表了当天之后股票价格-今天的价格的最大值,我们需要找出其中的最大值,它就是最终的股票最大利润。

代码实现

/**
 * 计算股票最大利润
 * @param {number[]} prices 股票价格数组
 * @return {number} 最大利润
 */
const maxProfit = (prices) => {
  if (prices.length < 2) {
    return 0;
  }

  // 定义一个数组来存储当天之后股票的价格-今天的价格的最大值
  const maxProfits = [];

  // 遍历每一个元素
  for (let i = 0; i < prices.length; i++) {
    // 取出剩余元素
    const subPrices = prices.slice(i + 1);

    // 将元素按照升序排列
    subPrices.sort((a, b) => a - b);

    // 计算出第一个元素和最后一个元素之差
    const maxProfit = subPrices[subPrices.length - 1] - subPrices[0];

    // 将它存储到数组中
    maxProfits.push(maxProfit);
  }

  // 找出数组中的最大值
  const maxProfit = Math.max(...maxProfits);

  return maxProfit;
};

时间复杂度分析

时间复杂度为O(n^2),其中n为股票价格数组的长度。

空间复杂度分析

空间复杂度为O(n),其中n为股票价格数组的长度。