解法一 贪心
思路:对每一个索引位置都计算出到达该位置最少需要跳几次,在必须增加跳跃次数时才增加。
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
}
时间复杂度,空间复杂度。
解法二 在解法一的基础上优化空间复杂度
思路:和解法一相同,但是优化了空间复杂度
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
}
时间复杂度,空间复杂度。