持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
难度:
中等
题目:
给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持有一股股票。你也可以先购买,然后在同一天出售。返回你能获得的最大利润 。
示例:
输入:prices = [7,1,5,3,6,4]
输出:7
解释:第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。总利润为 4 + 3 = 7 。
解题思路:
根据题目要求,由于不限制交易次数,那么可以认为只要第二天的价格大于前一天就可以卖出,累加上升趋势的差值即可得到最大利润,即贪心算法。
当然这道题也可以使用动态规划算法寻求最优解,但是许多最优解的问题是用动态规划有些大材小用,而本题完全可以使用简单的贪心算法来解决,所谓的贪心算法即在每一步都做出当时看起来最佳的选择,也就是说它做出的是局部最优选择,从而导致全局的最优解。
如解题代码所示,我们对股票票价数组进行一次遍历,在D区域可以拆分成A、B、C三次盈利区间,那么累加上升区段的利润即可获得D区域的最优解,同理,本题只需要累加全部上升区段的利润即可获得全局最优解。
解题代码:
var maxProfit=function(prices) {
let len = prices.length;
if (len < 2) {
return 0;
}
let res = 0;
for (int i = 1; i < len; i++) {
res + = prices[i] - prices[i - 1]>0?prices[i] - prices[i - 1]:0;
}
return res;
};
复杂度分析:
- 时间复杂度:O(n),其中 n 是股价数组的长度,共循环n次。
- 空间复杂度:O(1)。只需要使用常数数组的长度的额外空间。