携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
昨天,大A又痛伤我们一次。让人不禁想问:什么才是买卖股票的最佳时机??
看下面这张图,原来股市预测是数学深渊的尽头。
我尼玛,罢了罢了,现实中,预测股票太难了~
不如回到咱们的:算法题- 买卖股票的最佳时机,原则就一个:简单题,重拳出击!!
题目:
给定一个数组 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。
解:
思路:
后面的数字一定要大于前面的数字,才会有利润。
我们看示例拆解问题:[7,1,5,3,6,4]
如果数组是 [7],利润为 0
如果数组是 [7,1],1小于7,利润为 0
如果数组是 [7,1,5],利润为 5-1=4
如果数字是 [7,1,5,3],利润最大是 5-1=4
如果数字是 [7,1,5,3,6],利润最大是 6-1=5
如果数字是 [7,1,5,3,6,4],利润最大是 6-1=5
所以,最大利润为 5
这题看着有点像“连续子数组最大和”那道题。
将题目中的话转化理解:
- 怎么保证最大?用数组靠右边最大的数,减去数组靠左边最小的数;
- 用一个变量 min 来存储最小值。
- 然后一次遍历,用当前项减去最小值,得到利润,然后每次遍历都更新这个利润值,保证它始终最大
- 最后输出最大利润值
代码实现:
/**
* @param {number[]} prices
* @return {number}
*/
var maxProfit = function(prices) {
let min = prices[0]
let res = 0
for(let i=0,len=prices.length;i<len;i++){
if(prices[i] < min){
min = prices[i]
}else if(prices[i]-min > res){
res = prices[i] - min
}
}
return res
};
小结:
现实中的股票买卖比这个难太多了。。。
OK,以上便是本篇分享。点赞关注评论,为好文助力👍
我是掘金安东尼 🤠 100 万人气前端技术博主 💥 INFP 写作人格坚持 1000 日更文 ✍ 关注我,安东尼陪你一起度过漫长编程岁月 🌏