121. 买卖股票的最佳时机|刷题打卡
create by db on 2021-3-8 23:28:00
Recently revised in 2021-3-8 23:48:57
闲时要有吃紧的心思,忙时要有悠闲的趣味
原题链接121. 买卖股票的最佳时机 目录
题目描述
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例 1:
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
提示:
- 1 <= prices.length <= 105
- 0 <= prices[i] <= 104
思路分析
思路一:暴力遍历
数组中两个数字的最大差值即为最大利润maxprofit
比较差值求出max(prices[j] - prices[i]) (j > i)
- 时间复杂度: O(n^2),循环运行n(n-1)/2次
- 空间复杂度: O(1),只使用了常数个变量
tips:
很遗憾,这个算法被LeetCode判为超时……
思路二:一次遍历
📈低买高卖才能赚钱
- 一个变量minprice存储
历史最低价
- 一个变量max存储
最大利润
遍历整个数组,有两种可能
-
当前值
小于历史最低价
,则更新历史最低价
-
当前值
大于历史最低价
,则取 [当前值-历史最低价]与最大利润
之间的较大值,更新最大利润
循环一遍就可以了
- 时间复杂度:O(n)
- 空间复杂度:O(1)
AC 代码
题解一:暴力遍历
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
let max = 0;
for (let i = 0; i < prices.length; i++) {
for(let j = i + 1; j < prices.length; j++) {
if(prices[j] > prices[i]) {
max = Math.max(prices[j] - prices[i], max);
}
}
}
return max;
};
题解二:一次遍历
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
let minprice = prices[0]
let max = 0
for(let i = 0;i<prices.length;i++){
if(prices[i]<minprice){
minprice = prices[i]
}else{
max = Math.max(max,prices[i]-minprice)
}
}
return max
};;
总结
三月你好,春暖花开。我要进大厂!加油!
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情
后记:Hello 小伙伴们,如果觉得本文还不错,记得点个赞或者给个 star,你们的赞和 star 是我编写更多更丰富文章的动力!GitHub 地址
文档协议
db 的文档库 由 db 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于github.com/danygitgit上的作品创作。
本许可协议授权之外的使用权限可以从 creativecommons.org/licenses/by… 处获得。