給出一維非負元素的數組,每一個元素表明從該元素位置能跳的最遠距離。假設初始位置在第一個元素,現根據輸入數組判斷是否能跳到數組的末尾。數組
書中解法:第一個指針掃描當前值,第二個指針記錄能跳的最遠距離Curmax=max(A[i]+i,Curmax)。若是Curmax>=A.length-1,return true;若是Curmax等於第一個指針位置而且第一個指針值爲0,則不能到末尾。ide
1 bool canJump(int A[],int length) 2 { 3 if(length<=1) 4 return true; 5 int i,curMax=0; 6 for(i=0;i<length-1;i++) 7 { 8 if(A[i]==0&&curMax<i+1) return false; 9 if(A[i]+i>curMax&&A[i]>0) 10 { 11 curMax=i+A[i]; 12 if(curMax>=length-1) return true; 13 } 14 } 15 return false; 16 }
擴張問題:假設輸入數組能知足達到數組末尾的條件,求出最少跳數。spa
第一個指針記錄上一次的最遠到達距離,第二個指針記錄當前能到達的最遠距離。當遍歷數組的時候,若是當前位置超過了第一個指針位置,則跳數加1而且更新第一個指針的位置爲第二個指針的位置。若是當前位置加A[i]超過了第二個指針的位置,則更新第二個指針的值。指針
1 int jump(int A[],int length) 2 { 3 int result=0; 4 int last=0,curr=0; 5 for(int i=0;i<length;++i) 6 { 7 if(i>last) 8 { 9 last = curr; 10 result++; 11 } 12 curr = max(curr,i+A[i]); 13 } 14 return result; 15 }