diff --git a/problems/0122.买卖股票的最佳时机II.md b/problems/0122.买卖股票的最佳时机II.md index 57b174d9..d094da48 100644 --- a/problems/0122.买卖股票的最佳时机II.md +++ b/problems/0122.买卖股票的最佳时机II.md @@ -46,7 +46,7 @@ ### 贪心算法 -这道题目可能我们只会想,选一个低的买入,在选个高的卖,在选一个低的买入.....循环反复。 +这道题目可能我们只会想,选一个低的买入,再选个高的卖,再选一个低的买入.....循环反复。 **如果想到其实最终利润是可以分解的,那么本题就很容易了!** @@ -198,38 +198,40 @@ class Solution: ### Go: -```golang -//贪心算法 +贪心算法 +```go func maxProfit(prices []int) int { var sum int for i := 1; i < len(prices); i++ { // 累加每次大于0的交易 - if prices[i]-prices[i-1] > 0 { - sum += prices[i]-prices[i-1] + if prices[i] - prices[i-1] > 0 { + sum += prices[i] - prices[i-1] } } return sum } ``` - -```golang -//确定售卖点 +动态规划 +```go func maxProfit(prices []int) int { - var result,buy int - prices=append(prices,0)//在price末尾加个0,防止price一直递增 - /** - 思路:检查后一个元素是否大于当前元素,如果小于,则表明这是一个售卖点,当前元素的值减去购买时候的值 - 如果不小于,说明后面有更好的售卖点, - **/ - for i:=0;iprices[i+1]{ - result+=prices[i]-prices[buy] - buy=i+1 - }else if prices[buy]>prices[i]{//更改最低购买点 - buy=i - } + dp := make([][]int, len(prices)) + for i := 0; i < len(dp); i++ { + dp[i] = make([]int, 2) } - return result + // dp[i][0]表示在状态i不持有股票的现金,dp[i][1]为持有股票的现金 + dp[0][0], dp[0][1] = 0, -prices[0] + for i := 1; i < len(prices); i++ { + dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]) + dp[i][1] = max(dp[i-1][0] - prices[i], dp[i-1][1]) + } + return dp[len(prices)-1][0] + +} +func max(a, b int) int { + if a > b { + return a + } + return b } ```