80 lines
2.2 KiB
Go
80 lines
2.2 KiB
Go
package top100liked
|
||
|
||
import (
|
||
"testing"
|
||
)
|
||
|
||
// https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/?envType=study-plan-v2&envId=top-100-liked
|
||
// 121. 买卖股票的最佳时机
|
||
//
|
||
// 给定一个数组 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 <= prices.length <= 10^5
|
||
// - 0 <= prices[i] <= 10^4
|
||
|
||
// 暴力法,超时
|
||
// func maxProfit(prices []int) int {
|
||
// maxProfit := 0
|
||
// for i := range prices {
|
||
// for j := i + 1; j < len(prices); j++ {
|
||
// if prices[j] > prices[i] {
|
||
// maxProfit = max(maxProfit, prices[j]-prices[i])
|
||
// }
|
||
// }
|
||
// }
|
||
// return maxProfit
|
||
// }
|
||
|
||
func maxProfit(prices []int) int {
|
||
minimum := make([]int, len(prices)) // minimum[i] 是 i 天前最小购入价
|
||
res := 0
|
||
for i := range prices {
|
||
if i == 0 {
|
||
minimum[0] = prices[0]
|
||
} else {
|
||
minimum[i] = min(minimum[i-1], prices[i])
|
||
res = max(res, prices[i]-minimum[i])
|
||
}
|
||
}
|
||
return res
|
||
}
|
||
|
||
func TestMaxProfit(t *testing.T) {
|
||
cases := []struct {
|
||
name string
|
||
prices []int
|
||
want int
|
||
}{
|
||
{"example1", []int{7, 1, 5, 3, 6, 4}, 5},
|
||
{"example2", []int{7, 6, 4, 3, 1}, 0},
|
||
{"single", []int{5}, 0},
|
||
{"two days profit", []int{1, 5}, 4},
|
||
{"two days no profit", []int{5, 1}, 0},
|
||
{"profit at end", []int{2, 4, 1}, 2},
|
||
}
|
||
for _, c := range cases {
|
||
t.Run(c.name, func(t *testing.T) {
|
||
got := maxProfit(c.prices)
|
||
if got != c.want {
|
||
t.Errorf("got %d, want %d", got, c.want)
|
||
}
|
||
})
|
||
}
|
||
}
|