题目描述
给定一个数组,它的第 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);