买卖股票的最佳时机(122)

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法1:双层遍历,这样是时间复杂度为 O(n2),加上一个哨兵值就可以算出来,代码如下。

package main 

import "fmt"

func main() {
    prices  := []int{2,3,4,54,1,10000}
    maxProfit := maxProfit(prices)
    fmt.Println(maxProfit)
    
}

func maxProfit(prices []int) int {
    maxProfit := 0 // 哨兵值
    for i:=0;i<len(prices) - 1;i++ {
        // 双层循环  prices[0] 买入 然后和 price[1],price[2]... 相减,求每次循环的最大值
        for j:=i+1;j<len(prices);j++ {
            
            if prices[j] - prices[i] > maxProfit && prices[j] - prices[i] >= 0 {
                maxProfit = prices[j] - prices[i]
            }
        }
    }
    return maxProfit 
}

第二种解法:叫动态规划,我觉得其实也是哨兵。只不过时间复杂为 0(n),下面的代码在leetcode 上会报错的,错误是

 panic: runtime error: index out of range [0] with length 0
main.maxProfit(0x5d5f70, 0x0, 0x0, 0x4cf400)
solution.go, line 6
main.__helper__(...)
solution.go, line 32
main.main()
solution.go, line 60

因为,在leetcode上会考虑到极端情况,在prices为空数组的情况,所以还得判断极端情况,这点是我写代码最缺乏的。所以得加上判判断

if len(prices) <= 0 {
    return 0
}
package main 

import "fmt"

func main() {
    prices  := []int{2,3,4,54,1,10000}
    maxProfit := maxProfit(prices)
    fmt.Println(maxProfit)
    
}



func maxProfit( prices []int) int {
    if len(prices) <= 0 {
        return 0
    }

    maxValue := 0
    minValue := prices[0] 

    for i := 1;i<len(prices);i++ {
        maxValue = max(maxValue,prices[i] - minValue)
        minValue = min(minValue,prices[i])
    }
    return maxValue
}

func max(i,j int ) int {
    if i > j {
        return i
    }
    return j
}

func min(i,j int ) int {
    if i > j {
        return j
    }
    return i
}

Gabriel
36 声望4 粉丝