携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
题目
给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
示例 1
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
示例 2
输入: nums = [2,3,0,1,4]
输出: 2
提示
- 1 <= nums.length <= 10^4
- 0 <= nums[i] <= 1000
题解
思路
这个题目是给你一个非负整数数组 nums ,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。
这个题我们可以看一下例子:输入: nums = [2,3,1,1,4]
一开始我们起始位置是0,然后我们看第一个索引是2,,这时我们就有了选择,可以走一步,也可以走两步,那到底走几步呢?取决于后面选哪个走的更远,如果走一步走的更远,我们就走一步,反之,我们走2步,走一步到1的位置,答案加1,1+3 =4,如果走两步,走到2的位置,往后只能走一步,走到3,但4包括3的策略,所以我们走一步。
确定操作对象:本题中,操作对象1个nums 确定操作条件:看看之后走的步数,大不大于原来的步数,大于就从这开始走 确定操作过程:先走一步,看看之后能走几步,选一个往后走的步数最大的位置,就是我们下一步要去的位置。 确定结果返回:返回最终结果。
代码
class Solution {
public:
int jump(vector<int>& nums) {
int ans = 0;
int start = 0;
while(start < nums.size()-1){
int end = start+nums[start];//move
ans++;
if(end >= nums.size()-1) return ans;
int next = end;
for(int i = start+1; i<=end;i++){
if(i+nums[i]>next){
next = i+nums[i];
start=i;
}
}
// ans++;
}
return ans;
}
};
结语
业精于勤,荒于嬉;行成于思,毁于随。