给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是2
。 从下标为 0 跳到下标为 1 的位置,跳1
步,然后跳3
步到达数组的最后一个位置。
说明:
假设你总是可以到达数组的最后一个位置。
class Solution {
public:
int jump(vector<int>& nums) {
/*
对于这道题目的话,首先这道题目可以看出来 假设F(x) 为 能跳到的最远的距离
那么 F(x) 为分段函数,举个例子
0,1,1,1,2,2,2,2,3,3,3,3,3,4,4,4,4
第 0个格子只需要 0步就可以跳的到;
第 1到3 个格子需要1 步就可以跳的到
第4 到7 个格子可以两个步骤就可以跳的到
*/
int left =0; //因此在这里我们利用一个区间搜索的形式来进行搜索 left左边界,right 右边界
int right =0;
int temp =0;
if(nums.size() ==1){
return 0;
}
while (left <=right){//最开始的时候 leftleft==right==0
int max_dist =0; //最开始的时候我们利用一个变量来代表当前区间内最远能到的距离
for(int i=left;i<=right; i++){
max_dist = max(max_dist, nums[i] + i);
}
left = right +1;//在这里不断地更新左边界和右边界;
right = max_dist;
temp ++;//步数 +1
if(right >= (int) nums.size()-1) {
break;//当最后的数据已经在我们当前区间能到达的最远范围的时候,就停止,用 break;
}
}
return temp;
}
};
//加油,加油,Try to make yourself more excellent...