LeetCode热题(JS版) - 122. 买卖股票的最佳时机 II

95 阅读2分钟

题目描述

给定一只股票每天的价格,可以进行多次买卖,但是必须先卖出再买入。设计算法获取最大收益。

示例

示例1:

Input: [7,1,5,3,6,4]
Output: 7
Explanation: 第二天(价格为1)买入,第三天(价格为5)卖出,第四天(价格为3)买入,第五天(价格为6)卖出。总共的收益为(5-1)+(6-3)=7

示例2:

Input: [1,2,3,4,5]
Output: 4
Explanation: 从第一天(价格为1)买入,到最后一天(价格为5)卖出,总共的收益为(5-1)=4

示例3:

Input: [7,6,4,3,1]
Output: 0
Explanation: 在该情况下,不需要进行任何交易,因此最大收益为0。

解法

这道题可以使用贪心算法来解决。我们可以通过观察价格曲线图可以发现,只要当明天的价格比今天高,那么今天就可以买进股票,明天就可以卖出股票。因此,我们可以用一个变量记录当前最低价格,如果遇到一个更低的价格,那么我们就更新这个变量。然后,如果遇到一个比当前最低价格高的价格,我们就尝试在前一天买入并在今天卖出。因为只要价格是上升的,那么卖出后再买入总能获得更多的利润。

代码

function maxProfit(prices: number[]): number {
    let minPrice = prices[0];
    let maxProfit = 0;
    for (let i = 1; i < prices.length; i++) {
        if (prices[i] < minPrice) {
            minPrice = prices[i];// 价格下降的时候更新最小价格
        } else if (prices[i] > minPrice) {
            maxProfit += prices[i] - minPrice;// 只要价格上升就是盈利的
            minPrice = prices[i];// 卖出后需要更新最小价格
        }
    }
    return maxProfit;
}

时间复杂度

假设数组的长度为n,则时间复杂度为O(n),因为我们只需要遍历整个数组一次即可。因此,该算法的时间复杂度是线性的。