题目描述:
给定一个长度为 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]。
本人菜鸟一枚,刚开始刷题,所以在做这道题的时候陷入了一些不好的方法,即:针对一个错误的输入去设置一种条件满足该输入,结果就是导致不停修改代码,但是东拼西凑总是不能满足所有情况的。
最后思路:
当前站在第一个位置,向后遍历我所拥有的步数次,遍历时分两种情况,第一种,遍历过程中发现到达了数组边界,即当前所在位置索引=numsSize-1,此时将标志位flag置1并且跳出循环;第二种情况,遍历过程中达不到数组边界,对每一次遍历到的位置,判断在该位置时,根据该位置所拥有的步数能够到达的最远位置,遍历后保存能够到达的最大值的索引。
跳出该循环之后,判断flag是否为1,若为1则已经到达边界,count++并且返回;
若未到达边界,则将现在的位置移动至能够到达最远位置的索引处,更新位置,更新步数;
最后判断一下更新的位置是否在数组边界处,若在边界处也直接返回;
下面附上代码,我觉得我的代码有一些冗余,定义了大量的变量,还有标志位。。。(嵌入式后遗症),欢迎大家提供更高效简便的代码供学习。
int jump(int* nums, int numsSize) {
if(numsSize==1){
return 0;
}
//定义当前拥有的step数
int step = nums[0];
//定义当前所在位置
int loc = 0;
int count = 0;
int fast = 0;
while(loc<numsSize){
int temp=0;
int new_loc=0;
int flag = 0;
//循环得到当前位置步数范围内的最大步数
for(int i=0;i<step;i++){
if(loc+i+1>=numsSize-1){
flag = 1;
count++;
break;
}
if(((loc+i+1)+nums[loc+i+1])>=fast){
fast = ((loc+i+1)+nums[loc+i+1]);
temp = nums[loc+i+1];
new_loc = loc+i+1;
}
}
if(flag == 1){
break;
}
//迁移至新位置
loc = new_loc;
//赋予新步数
step = temp;
count++;
if(loc>=numsSize-1) break;
}
return count;
}

被折叠的 条评论
为什么被折叠?



