给定一个长度为 n
的 0 索引整数数组 nums
。初始位置为 nums[0]
。
每个元素 nums[i]
表示从索引 i
向前跳转的最大长度。换句话说,如果你在 nums[i]
处,你可以跳转到任意 nums[i + j]
处:
0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1]
的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]
。
思路 贪心算法
currMaxPos为当前跳跃次数可达最大距离,nextMaxPos为下一次跳跃可达最大距离。
如果 i>currMaxPosition,则下标 i 超出跳跃次数 currJumps 可以到达的最大下标,因此到达下标i的最小跳跃次数 + 1,currMaxPos 更新为 nextMaxPos
public class Solution {
public int Jump(int[] nums) {
int currMaxPos = 0, nextMaxPos = 0;
int stepNums = 0;
for(int i = 0; i < nums.Length; i++)
{
if(i > currMaxPos)
{
stepNums++;
currMaxPos = nextMaxPos;
}
nextMaxPos = Math.Max(nextMaxPos, nums[i] + i);
}
return stepNums;
}
}
复杂度分析
-
时间复杂度:O(n),其中 n 是数组 nums 的长度。需要遍历数组一次,每个下标处的计算时间是 O(1)。
-
空间复杂度:O(1)。