这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战
题目
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
示例
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
输入: nums = [2,3,0,1,4]
输出: 2
提示
1 <= nums.length <= 10^40 <= nums[i] <= 1000
解题思路
贪心
在数组中,我们每次移动,在当前位置都有一个值对应着其可以跳跃的长度。长度有长有短,在假设我们必定能够到达最后一个位置的条件下,我们需要做的就是遍历每一位元素,不断刷新最长边界,争取使用最少的次数跳跃到目标位置。
我们可以维护一个当前能够抵达的最长边界下标位置,当移动到该位置时,次数+1。
在移动的过程成,我们需要不断更新最长边界下标,这样才可以得出单次跳跃范围内可达最远边界。
class Solution {
public int jump(int[] nums) {
int n = nums.length, end = 0, max = 0, step = 0;
for(int i = 0; i < n - 1; ++i){
// 更新单次跳跃可达最远边界下标
max = Math.max(max, i + nums[i]);
// 判断是否达到最远边界下标位置
if(i == end){
// 更新下次最远边界坐标值
end = max;
// 次数 +1
++step;
}
}
// 返回结果
return step;
}
}
复杂度分析
- 时间复杂度:
- 空间复杂度:
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!