力扣 55:跳跃游戏
题目说非负整形数组,那么显而易见每个数都大于等于 0,那数组只会存在两种情况:
1.包含数字 “0” 的数组。
2.不包含数字 “0”的数组。
对于情景1,我们需要判断它能不能到达数组末尾,而对于情景2我们不需要判断,因为它肯定能到达数组最末尾,哪怕每次只前进1。
所以我们需要处理情景1。
而对于含0的数组,我们只需要 判断0的位置前面的数组是否能够越过0这个位置 即可。
方法如下:
if(nums.length == 1){
return true;
}
if(haveZero(nums) == false){
return true;
}
boolean res = true;
for(int i=nums.length-1;i>=0;i--){
//若能跳过所有的0 则能到达末尾
if(nums[i] == 0){
//这里需要注意的是得 若数组最末尾的数是0 则不需要跳过 所以加上对i为止的判断
if(canThrough(Arrays.copyOf(nums,i)) == false && i != nums.length-1){
res =false;
break;
}
}
}
return res;
}
public boolean haveZero(int[] nums){
for(int i:nums){
if(i == 0){ return true; }
}
return false;
}
//能否跳过当前的0
public boolean canThrough(int[] arr){
boolean res = false;
for(int i=0;i<arr.length;i++){
if(i+arr[i] > arr.length){
return true;
}
}
return res;
}
时间复杂度
O(n^2)
,m为数组中0出现的个数。