跳跃游戏
跳跃游戏
题干
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
解法
1.初始想法:从末位开始,逐位传递
class Solution {
public boolean canJump(int[] nums) {
if(nums.length<=1){
return true;
}
int [] whether=new int[nums.length];
whether[nums.length-1]=1;
for(int i=nums.length-2;i>=0;i--){
if(have1(whether,nums[i],i)){
whether[i]=1;
}
else{
whether[i]=0;
}
}
if(whether[0]==0){
return false;
}
else{
return true;
}
}
boolean have1(int[]whether,int step,int cur){
if(step==0){
return false;
}
for(int i=1;i<=step;i++){
if(whether[i+cur]==1){
return true;
}
}
return false;
}
}
2.贪心算法:从头到尾遍历,如果最大的能到达的位置大于或等于最后数组的最后一个位置,即返回true,否则返回false
class Solution {
public boolean canJump(int[] nums) {
if(nums.length<=1){
return true;
}
int maxPosition=0;
for(int i=0;i<nums.length;i++){
if(nums[i]+i>maxPosition&&maxPosition>=i){//可以进一步优化
//当i>maxPosition的时候,后面的step都毫无意义,因为根本无法到达,直接return false即可。
maxPosition=nums[i]+i;
}
}
if(maxPosition>=nums.length-1){
return true;
}else{
return false;
}
}
}

浙公网安备 33010602011771号