-
題目描述
給定一個非負整數數組,你最初位於數組的第一個位置。數組中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最後一個位置。
示例 1:
輸入: [2,3,1,1,4]
輸出: true
解釋: 從位置 0 到 1 跳 1 步, 然後跳 3 步到達最後一個位置。
示例 2:
輸入: [3,2,1,0,4]
輸出: false
解釋: 無論怎樣,你總會到達索引爲 3 的位置。但該位置的最大跳躍長度是 0 , 所以你永遠不可能到達最後一個位置。
-
思路
- 動態規劃
假設輸入的非負數組爲nums,那麼某個位置i可以到達的區間爲,如果在這個區間內的任一位置能到達最後的位置,那麼位置i就可以到達最後的位置。
通過上面的分析,我們可以從後往前來依次確定每個位置是否可以到達最後的位置;
- 貪心
在動態規劃中,爲了確定i是否能到達最後的位置,需要掃描右邊的nums[i]個位置,但是這個掃描是完全沒有必要的,因爲可以直接記錄上一個可以到達最後的位置的位置;
-
C++實現
- 動態規劃
bool canJump(vector<int>& nums){ int size = nums.size(); if(size==0)return true; vector<int> res(size); // 0表示不能到達,1表示能到達 res[size-1] = 1; //最後的位置設爲1 for(int i=size-2;i>=0;i--){//從倒數第2個位置,依次確定是否可以到達最後的位置 int furthestJump = min(i+nums[i],size-1);//最遠可以到達的位置 for(int j=i+1;j<=furthestJump;j++){ if(res[j]==1){ res[i]=1; break; } } } return res[0]==1; }
時間複雜度:對於位置i,需要掃描min(nums[i],n)個位置,其中n是數組長度,因此時間複雜度爲;
- 貪心
bool canJump(vector<int>& nums){ int lastPos = nums.size()-1; for(int i = nums.size()-1;i>=0;i--){ if(i+nums[i]>=lastPos) lastPos = i; } return lastPos==0; }
時間複雜度:只掃描一次,時間複雜度;