【图解版】力扣第121题:买卖股票的最佳时机
思路
每天有两个步骤:
- 更新到今天为止的最低价格(老子前面几天最低点都记下了)
- 更新到今天为止的最大利润(今天卖能赚多少)
可能会想着:更新从前面到最后一天的最低价格,其实每天更新的时候,维护好自己当前的最小值就可以了,一直遍历到最后,自然而然就得到了全局的最低价格,而且每天的最大利润也是只能和前面遍历过的最低值比较,不能和后面的最低值比较,所以一开始直接取全局最小也没什么意义。
这个转移方程可以写成这样:
最大利润 = max(最大利润 , 今天的价格 − 最低价格)
最低价格 = min(最低价格, 今天的价格)
边界条件:一开始没有最低价格,也没有利润。所以我们从第一天的价格入手,默认最低价格是第一天的价格,利润是0。也可以写成无穷小。
Golang代码实现
func maxProfit(prices []int) int {
maxProfit := math.MinInt64 // 最大利润
minNum := math.MaxInt64 // 最小值
for i := range prices {
if prices[i] < minNum {
minNum = prices[i]
}
if maxProfit < prices[i] - minNum {
maxProfit = prices[i] - minNum
}
}
return maxProfit
}