JS算法-买卖股票的最佳时机2

193 阅读2分钟

题目

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

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

输入: prices = [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0

解题思路

我们这里使用贪心算法来解题,在函数中先判断prices形参长度是否小于2,如果小于2则直接返回0,因为只有一个价格或者没有价格,无法进行交易,也就没有利润。接下来声明四个变量,profit变量用于存储利润,valley变量用于存储低谷的价格,默认值是prices形参的第一个值,peak变量用于存储山峰的价格,默认值也是prices形参的第一个值,然后声明一个i变量用于遍历prices形参,然后使用while循环进行将当前值和后一个值进行比较,如果当前i变量小于prices形参数据长度则进行循环,在while循环中在声明两个循环,第一个循环用户查找第一个低谷,也就是当前值在降低或者不变时,则说明还没有找到低谷,就继续循环,直到找到一个比后面元素小的数,则将当前值赋值给valley变量,然后再进行查找山峰,在声明一个循环,当前值一直上升或不变时,则说明还没有找到山峰,则一直进行循环,直到找到一个比后面元素大的数,则将当前值赋值给peak变量,最后将最山峰变量peak与低谷变量valley进行相减并于当前的利润变量profit相加并赋值给profit变量进行更新当前利润,最后将利润变量profit返回出去即可

var maxProfit = function(prices) {
    if(prices.length < 2) return 0
    let profit = 0,valley = prices[0] ,peak = prices[0], i = 0;
    while(i < prices.length -1) {
        while(i < prices.length - 1 && prices[i] >= prices[i + 1]) {
            i++
        }
        valley = prices[i]
        while(i < prices.length - 1 && prices[i] <= prices[i + 1]) {
            i++
        }
        peak = prices[i]
        profit += peak - valley
    }
    return profit
};

坚持努力,无惧未来!