-
Notifications
You must be signed in to change notification settings - Fork 0
/
max_profit.go
49 lines (41 loc) · 1.74 KB
/
max_profit.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package greedy
import "math"
/**
* @description 121. 买卖股票的最佳时机
* @author chengzw
* @since 2022/5/18
* @link https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/
*/
/**
给定一个数组 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.用一个变量记录一个历史最低价格 minprice,我们就可以假设自己的股票是在那天买的,我们在第 i 天卖出股票能得到的利润就是 prices[i] - minprice。
2.只需要遍历价格数组一次,动态更新 minprice 和 maxprofit(prices[i] - minprice),当遍历完数组后,就得到了最终结果。
时间复杂度:O(n),只需要遍历一次。
空间复杂度:O(1),只使用了常数个变量。
*/
func maxProfit(prices []int) int {
maxprofit := 0
minprice := math.MaxInt
for _, price := range prices {
if price < minprice {
minprice = price
} else if price-minprice > maxprofit {
maxprofit = price - minprice
}
}
return maxprofit
}