题目描述
给定一只股票每天的价格,可以进行多次买卖,但是必须先卖出再买入。设计算法获取最大收益。
示例
示例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),因为我们只需要遍历整个数组一次即可。因此,该算法的时间复杂度是线性的。