This commit is contained in:
2026-07-23 16:56:50 +08:00
parent 124ad9afdf
commit 92784ffb0f
36 changed files with 2015 additions and 608 deletions
+79
View File
@@ -0,0 +1,79 @@
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)
}
})
}
}