day16: 121. 买卖股票的最佳时机 (简单)
思路:
- 借用动态规划思路: 初始化表格全部为二维表格,我们只填充表格的一半,因为每次需要保证时间不能往回减(j=i+1),而且要保证第二天的本金足够才能够继续投钱(p2-p1>0),将利润结果存入数组中。 举得几个例子和自己随便写的几个测试用例结果都是对的,只是数据量过大时会报超出内存限制错误。
- 动态规划:每过一天就求以此最低的买入价格和卖出价格,到最后自然就是可得的利润。
第一种:
var maxProfit = function (prices) {
let n = prices.length;
let dp = new Array(n).fill(0).map(() => new Array(n).fill(0));
dp[0][0] = 0;
let result = 0;
for (let i = 0; i < n; i++) {
let p1 = prices[i];
//保证不会往回减
for (let j = i + 1; j < n; j++) {
let p2 = prices[j];
//第二天的钱比第一天多
if (p2 - p1 > 0) {
dp[i + 1][j] = p2 - p1;
result = Math.max(result, dp[i + 1][j]);
}
}
}
console.log(dp);
return result;
};
第二种:
function maxProfit1(prices) {
let buy = prices[0],
sell = 0;
for (let i = 0; i < prices.length; i++) {
//求买入最低价时多少
buy = Math.min(buy, prices[i]);
//price-买入价格和当前销售价格比,求最大值,max即为最终答案
sell = Math.max(sell, prices[i] - buy);
}
return sell;
}
好吧,第二种不需要额外的大量的存储空间,空间复杂度当然比我写的优化很多。第一种主要浪费在表格的初始化上面。