1. 程式人生 > >LeetCode 第55題 跳躍遊戲

LeetCode 第55題 跳躍遊戲

ole 長度 兩個 for 否則 true 它的 spa n-1

給定一個非負整數數組,你最初位於數組的第一個位置。

數組中的每個元素代表你在該位置可以跳躍的最大長度。

判斷你是否能夠到達最後一個位置。

示例 1:

輸入: [2,3,1,1,4]
輸出: true
解釋: 從位置 0 到 1 跳 1 步, 然後跳 3 步到達最後一個位置。
示例 2:

輸入: [3,2,1,0,4]
輸出: false
解釋: 無論怎樣,你總會到達索引為 3 的位置。但該位置的最大跳躍長度是 0 , 所以你永遠不可能到達最後一個位置。












思路: 貪心算法 . 盡可能向右移動, 如果能能到達最後一個,返回true,否則返回false

i 0 1 2 3 4

nums   2 3 1 1 4
首先要確定一個上界upBound,比如:
1)當i=0時,nums[i]=2,表示目前最多能夠達到下標為2的位置,更新上界為2.不過目的地是下標為4的位置,所以要繼續掃描.
目前的上界為2,此時i=1(這裏比較繞. 也就是說,當i=0時,它的下一步是可以走到1,2兩個位置的,所以i=1這個位置是可以進行分析的,因為可以走到)
2)當i=1時.nums[i] = 3 ,表示目前最多能夠達到下標為4的位置,而nums數組的最後一個位置剛好為4,所以後面i=3,i=4不用繼續判斷了,因為i=2時,
最大已經能夠直接跳躍到終點了.



i 0 1 2 3 4
nums 3 2 1 0 4
1)當i=0時,nums[i]=3,表示目前最多能達到下標為3的位置,更新上界為3.不過目的地是下標為4的位置,所以要繼續掃描.
2)當i=1時,nums[i]=2,表示目前最多能達到下標為3的位置,更新上界為3.不過目的地是下標為4的位置,所以要繼續掃描.
3)當i=2時,nums[i]=1,表示目前最多能達到下標為3的位置,更新上界為3.不過目的地是下標為4的位置,所以要繼續掃描.
4)當i=3時,nums[i]=0,表示目前最多能達到下標為3的位置,更新上界為3.不過目的地是下標為4的位置,所以要繼續掃描.

5)當i=4時,upBound = 3 , 也就是說目前只能夠達到 3 的位置,nums[4]的值是沒有意義的,因為根本走不到i=4
return false.

關鍵是upBound的值,他表示目前最多能達到的位置
如果i的值大於upBound,說明位置i無法達到.
如果upBound的值>=len-1.說明最大能達到終點

 1 class Solution55 {
 2 
 3   public boolean canJump(int[] nums) {
 4     if (nums == null || nums.length == 0) {
 5       return false;
 6     }
 7     int upBound = 0;
 8     for (int i = 0; i <= upBound; i++) {
 9       upBound = Math.max(upBound, nums[i] + i);
10       if (upBound >= nums.length - 1) {
11         return true;
12       }
13     }
14     return false;
15   }
16 }

 

LeetCode 第55題 跳躍遊戲