Jump Game II
题目描述
跳跃游戏2
给定一个非负数组,最初位于数组的第一个位置。每个元素表示该位置可以跳跃的最大长度。求跳到最后一个位置所需最少次数。
示例:
输入: [2,3,1,1,4]
输出: 2
解法
解法一:贪心算法1
时间复杂度:
O(N)
空间复杂度:
O(1)
func jump(nums []int) int {
max := 0
counts := 0
remote := 0
for i := 0; i < len(nums)-1; i++ {
if max < i+nums[i] {
max = i+nums[i]
}
if i == remote {
if max == remote {
return -1
}
remote = max
counts++
}
}
return counts
}
解法二:贪心算法2
时间复杂度:
O(N^2)
空间复杂度:
O(1)
func jump(nums []int) int {
position := len(nums) - 1
steps := 0
for position > 0 {
for i := 0; i < position;i++ {
if i + nums[i] >= position {
position = i
steps++
break
}
}
}
return steps
}
解法三:暴力循环
时间复杂度:
O(N^2)
空间复杂度:
O(N)
func jump(nums []int) int {
n := len(nums)
max := 0
record := make([]int, n)
for i := 0; i < n-1; i++ {
if i > max {
return -1
}
if i+nums[i] > max {
max = i+nums[i]
}
for j := i+1; j <= i+nums[i] && j < n; j++ {
if record[j] == 0 || record[i]+1 < record[j] {
record[j] = record[i]+1
}
}
}
return record[n-1]
}
Last updated
Was this helpful?