leetcode121-买卖股票的最佳时机

171 阅读1分钟

题目描述

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。

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

方法一 暴力循环

针对第i买入,计算在第i ~ n天内哪天卖出可以获得最大收益, 一个简单的二重循环

let maxProfit = 0;

for (let buy = 0; buy < prices.length; buy++) {
    let value = prices[buy];
    for (let sale = buy + 1; sale < prices.length; sale++) {
        if (prices[sale] - value > maxProfit) {
            maxProfit = prices[sale] - value;
        }
    }
}

return maxProfit

时间复杂度 o(n方), 空间复杂度 o(1)

方法二 DP

首先我们要构建状态转移方程。 第n天卖出的最大收益 = max {第n-1天卖出的最大收益, 第n天卖出的价格 - 前n - 1天的最小价格}

可以抽象为 maxProfit(n) = max{maxProfit(n-1), Sale(n) - minBuy(n-1)}

let maxProfit = 0;

let minBuyValue = Infinity;

function minBuy(n) {
    if (prices[n - 1] < minBuyValue) {
        minBuyValue = prices[n - 1];
    }
    return minBuyValue;
}

for (let i = 1; i < prices.length; i++) {
    maxProfit = Math.max(maxProfit, prices[i] - minBuy(i));
}

return maxProfit

时间复杂度 o(n), 空间复杂度o(1);