55.跳躍遊戲(Jump Game)
阿新 • • 發佈:2018-11-13
我的GitHub,歡迎捧場:https://github.com/FuGaZn/LeetCode
題目描述
給定一個非負整數陣列,你最初位於陣列的第一個位置。
陣列中的每個元素代表你在該位置可以跳躍的最大長度。
判斷你是否能夠到達最後一個位置。
示例 1:
輸入: [2,3,1,1,4]
輸出: true
解釋: 從位置 0 到 1 跳 1 步, 然後跳 3 步到達最後一個位置。
示例 2:
輸入: [3,2,1,0,4]
輸出: false
解釋: 無論怎樣,你總會到達索引為 3 的位置。但該位置的最大跳躍長度是 0 , 所以你永遠不可能到達最後一個位置。
解題思路
我們在之前遇到過跳躍遊戲這個問題(Jump Game II),那題的要求是使用最少的跳躍次數到達陣列的最後一個位置。而這題問是否能跳到終點。
那麼我們想一下,在何種情況下跳不到終點?
倘若每次跳躍都是在向前,那麼哪怕每次跳1格,也能跳到終點呀。所以說,在陣列中肯定存在一個位置值為0,並且你無論怎麼跳都必須經過這一個位置。
這樣我們的思路就簡單了。我們首先找到陣列中為0的索引m,然後從這個位置向前遍歷,判斷是否存在一個索引為i,且nums[i]>m-i,從而使得可以跳過這個為0的位置。如果找不到這個m,則說明無法到達最後一個位置。
實現程式碼
class Solution {
public boolean canJump(int[] nums) {
if(nums==null || nums.length==0){
return false;
}
if(nums.length==1)
return true;
for(int i=0;i<nums.length;i++){
if(nums[i]==0){
boolean b = foo(nums, i) ;
if(b==false)
return false;
}
}
return true;
}
public static boolean foo(int[] nums,int ind){
int tmp = ind;
if(ind==nums.length-1)
tmp--;
for(int i=ind-1;i>=0;i--){
if(nums[i]>tmp-i){
return true;
}
}
return false;
}
}