「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」。
题目
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例 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 <= prices.length <= 105
- 0 <= prices[i] <= 104
解题思路
方法一:暴力破解
看到题目首先就想到了最简单的暴力破解法代码如下:
var maxProfit = function(prices) {
let left = 0, right =0
let res = 0
while(left < prices.length-1){
right = left + 1
while(right < prices.length){
if(prices[left] <= prices[right]){
ans = prices[right] - prices[left]
res = Math.max(ans, res)
}
right++
}
left++
}
return res
};
方法二:贪心
每一处卖出点的最佳时机都可以做一次判定
是与前一处卖出点相同还是有了更高卖点或更低买点
判断此点是否比买点更低或比卖点更高,更新买卖点,得到的最大差值即位最大收益
var maxProfit = function(prices) {
let min = prices[0]
let max = 0
for (let price of prices) {
max = Math.max(max, price - min)
min = Math.min(price, min)
}
return max
};
方法三:单调递减栈
维护一个单调递减栈
当出现比栈顶大的元素(价位)时,判定一次max,不将此元素加入栈
只有更小的元素会入栈,即为实时最低买入点,和贪心的思想差不多
var maxProfit = function(prices) {
const stack = new Array()
let max = 0
for(let i = 0; i < prices.length; i++){
if(stack.length != 0 && prices[i] > stack[stack.length - 1]){
ans = prices[i] - stack[stack.length - 1]
max = Math.max(ans, max)
continue
}
stack.push(prices[i])
}
return max
};
结束语
这里是小葵🌻,只要把心朝着太阳的地方,就会有温暖~
让我们一起来攻克算法难关吧!!