给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/jump-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法一 :无脑暴力求解
用深度优先搜索的方法,跳到某一位置后,下一步跳到最远位置,依次递减到1。
如果当前位置超过终点,也说明能跳到终点,返回true。若从该位置往后跳,怎么都跳不到终点,返回false。
优化时间:若已经知道从某一位置起跳,怎么都跳不动终点,可以将该位置记录下来。以后再次跳到该位置时可以直接返回false。用possi[]数组记录,possible[x] = 1表明该位置不可能跳到终点。
//深度优先搜索dfs
bool dfs(int* nums,int* possible,int n,int x){
//可以跳到终点
if(x >= (n - 1))
return true;
if( possible[x] == 0)
return false;
int max_jump = nums[x];
for(int i = max_jump;i > 0;i--){
if(dfs(nums,possible,n,x+i) == true)
return true;
}
possible[x] = 0;
return false;
}
bool canJump(int* nums, int numsSize){
//possible数组记录调到某个位置后,是否还有可能到达终点
//不可能的话直接退出,不然时间太久了
int* possible = malloc(sizeof(int)*numsSize);
for(int i = 0;i<numsSize;i++)
possible[i] = 1;
return dfs(nums,possible,numsSize,0);
}
运行结果:
方法二:记录能跳到的最远位置
一直维护能跳到的最远位置max_pos,刚开始时max_pos= 0;
从0到max_pos遍历这个数组,并实时更新max_pos的值,当max_pos >= (n - 1),说明能跳到终点,返回true。
某个位置 i 能跳到的最远位置为:i + nums[i],当这个值大于max_pos时,更新max_pos.
bool canJump(int* nums, int numsSize){
//记录能跳到的最远位置
//若最远位置超过终点,则能跳到终点
int max_pos = nums[0];
int temp;
for(int i =0;i<=max_pos;i++){
if(max_pos >= (numsSize -1))
return true;
//该位置能跳到的最远位置
temp = i + nums[i];
if(temp > max_pos)
max_pos = temp;
}
return false;
}
运行结果如下: