题干:
给定一个数组 prices
,它的第 i
个元素 prices[i]
表示一支给定股票第 i
天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
。
解法:
func max(a, b int) int {
if a > b {
return a
}
return b
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func maxProfit(prices []int) (ans int) {
mn := 10001
// 不断获取最小的值,计算当前值-最小值所能获得的利润
for _, p := range prices {
ans = max(ans, p - mn)
mn = min(mn, p)
}
return
}
具体示例:
给定的测试用例是 `[7, 1, 5, 3, 6, 4]`,我们将使用这个数组来分析每轮循环的变化。
初始时,最小价格 `mn` 被设置为一个较大的值(10001),最大利润 `ans` 为 0。
第一轮循环:
- 当前价格为 7,7 大于最小价格 `mn`(10001),所以更新最大利润 `ans` 为 7 - 10001 = -9994。
- 更新最小价格 `mn` 为 7。
第二轮循环:
- 当前价格为 1,1 小于最小价格 `mn`(7),所以更新最小价格 `mn` 为 1。
第三轮循环:
- 当前价格为 5,5 大于最小价格 `mn`(1),所以更新最大利润 `ans` 为 5 - 1 = 4。
第四轮循环:
- 当前价格为 3,3 小于最小价格 `mn`(5),所以更新最小价格 `mn` 为 3。
第五轮循环:
- 当前价格为 6,6 大于最小价格 `mn`(3),所以更新最大利润 `ans` 为 6 - 3 = 3。
第六轮循环:
- 当前价格为 4,4 小于最小价格 `mn`(6),所以更新最小价格 `mn` 为 4。
最终,最大利润 `ans` 的值为 4,表示在给定的价格数组中,可以获得的最大利润为 4。
通过分析每轮循环的变化,我们可以看到在遍历价格数组的过程中,不断更新最小价格和最大利润,从而得到最大的利润值。