leetcode 45. 跳跃游戏 II

200 阅读1分钟

题目链接

解法一 贪心

思路:对每一个索引位置都计算出到达该位置最少需要跳几次,在必须增加跳跃次数时才增加。

func jump(nums []int) int {
    l := len(nums)
    if l == 0 {
        panic("nums is empty")
    }
    if l == 1 {
        return 0
    }
    // l > 1
    dp := make([]int, l)
    // dp[0] = 0
    for i, j := 0, 1; i < l && j < l; i++ {
        n := nums[i]
        end := min(l, i+n+1)
        for j < end {
            dp[j] = dp[i]+1
            j++
        }
    }
    return dp[l-1]
}

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

时间复杂度O(n)O(n),空间复杂度O(n)O(n)

解法二 在解法一的基础上优化空间复杂度

思路:和解法一相同,但是优化了空间复杂度

func jump(nums []int) int {
    l := len(nums)
    if l == 0 {
        panic("nums is empty")
    }
    if l == 1 {
        return 0
    }
    if l == 2 {
        return 1
    }
    var (
        curr int // 当前最远到达的索引
        step int // 当前最少跳了几次
        next int // 下一跳最远到达索引
        end = l-1 // 简化下面for循环中的逻辑判断
    )
    for i := 0; i < end; i++ {
        x := i+nums[i]
        if x > next {
            next = x
        }
        if i == curr {
            step++
            curr = next
        }
    }
    return step
}

时间复杂度O(n)O(n),空间复杂度O(1)O(1)