1824. 最少侧跳次数

60 阅读1分钟

题目:
leetcode.cn/problems/mi… 算法: 方法一:动态规划

func minSideJumps(obstacles []int) int {
    sideJumps := []int{1, 0, 1}
    for _, obstacle := range obstacles[1:] {
        minCnt := math.MaxInt64
        for k := 0; k <= 2; k ++ {
            if obstacle - 1 == k {
                sideJumps[k] = math.MaxInt64 / 2
            } else {
                minCnt = min(minCnt, sideJumps[k])
            }
        }
        // 这里还不太好想到,容易写成丑陋代码
        // 先找到n点的最小侧跳次数minCnt,然后在最小侧调次数的基础上调一次到当前位置, min(sideJumps[j] , minCnt + 1)
        for j := range sideJumps {
            if obstacle - 1 != j {
                sideJumps[j] = min(sideJumps[j] , minCnt + 1)
            }
        }
    }
    return min(sideJumps[0], min(sideJumps[1], sideJumps[2]) )
}

func min(a, b int) int {
    if a > b {
        return b
    }
    return a
}