121买卖股票的最佳时机解题记录
虽然不清楚卖出是什么时候,买入一定是指向其前面的最小值的。
可以用双指针解决:
func maxProfit(prices []int) int {
min := prices[0]
res := 0
for _,v := range prices {
if res < v-min {
res = v-min
}
if v < min {
min = v
}
}
return res
}
但是我想知道单调栈是怎么做的
保证栈顶元素是目前最小的,比栈顶小的就入栈
func maxProfit(prices []int) int {
stack := []int{prices[0]}
res := 0
for i:=1; i<len(prices); i++ {
if prices[i] < stack[len(stack)-1] {
stack = append(stack, prices[i])
} else {
// 因为入栈的时候买入绝对是亏的,所以不入栈时可以考虑是否买入
cur := prices[i] - stack[len(stack)-1]
if cur > res {
res = cur
}
}
}
return res
}
用贪心来解的话,dp[i]=max(dp[i-1], prices[i]-min_prices): 第i天最大利润是前一天卖出的利润或者今天卖出的利润其中最大的
func maxProfit(prices []int) int {
dp := []int{0}
min := prices[0]
for i:=1; i<len(prices); i++ {
cur := prices[i] - min
if dp[i-1] > cur {
dp = append(dp, dp[i-1])
} else {
dp = append(dp, cur)
}
if min > prices[i] {
min = prices[i]
}
}
return dp[len(dp)-1]
}