LeetCode 第55題 跳躍遊戲
阿新 • • 發佈:2019-02-04
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題 跳躍遊戲