1. 程式人生 > >55.跳躍遊戲(Jump Game)

55.跳躍遊戲(Jump Game)

我的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; } }