思路
方法一的核心思想是简单的贪心策略。我们每天都看当前价格和下一个价格的差值。如果下一个价格高于当前价格(即diff > 0),那么就认为当天可以买入并在第二天卖出,赚取利润。因此,方法一把所有的价格差(即diff > 0的部分)累加起来,最终得出最大利润
步骤:
遍历整个数组,计算相邻两个价格的差值
如果差值为正(表示价格上涨),则加入利润
powershell
时间复杂度:O(n),其中 n 是 prices 数组的长度,因为只需要遍历一遍数组
空间复杂度:O(1),只使用了常量空间
方法二模拟买入和卖出的策略
重点是通过标记是否已经持有股票来区分买入和卖出时机
通过比较当前和前一个价格差(curdiff 和 prediff)来决定买入和卖出。
flag 标志用来表示当前是否持有股票。如果持有股票且价格下跌,则卖出;如果没有股票且价格上涨,则买入。
在循环结束后,检查是否还有未卖出的股票,如果有则在最后时刻卖出
方法二和之前的摆动序列很相似,也可以参考此博文
实现
方法1-贪心算法
js
var maxProfit = function (prices) {
let sum = 0;
for (let i = 0; i < prices.length - 1; i++) {
let diff = prices[i + 1] - prices[i]
if (diff > 0) {
// 可以买入
sum += diff
}
}
return sum;
};
方法2
js
var maxProfit = function (prices) {
let prediff = 0, curdiff = 0;
let sum = 0, flag = false;
for (let i = 0; i < prices.length - 1; i++) {
curdiff = prices[i + 1] - prices[i];
if (curdiff > 0 && prediff <= 0) {
// 可以买入
sum -= prices[i]
flag = true
prediff = curdiff
}
if (flag && curdiff < 0 && prediff >= 0) {
// 可以卖出
sum += prices[i]
flag = false;
prediff = curdiff
}
}
// 到最后都还没有卖出,把最后一个卖掉
if (flag) {
sum += prices[prices.length - 1]
}
return sum;
};