算法- 买卖股票的最佳时机

大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

这题看着有点像“连续子数组最大和”那道题。

将题目中的话转化理解:

  1. 怎么保证最大?用数组靠右边最大的数,减去数组靠左边最小的数;
  2. 用一个变量 min 来存储最小值。
  3. 然后一次遍历,用当前项减去最小值,得到利润,然后每次遍历都更新这个利润值,保证它始终最大
  4. 最后输出最大利润值

代码实现:

/**
* @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,以上便是本篇分享。点赞关注评论,为好文助力?

发表评论

相关文章