返回
剑指Offer——股票的最大利润(JS实现) |刷题打卡
前端
2024-02-20 06:59:48
前言
掘金团队号上线,助你 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为股票价格数组的长度。