u
This commit is contained in:
@@ -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)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user