OPPO 小布助手現已支援粵語模式,自稱粵語十級學者
阿新 • • 發佈:2021-12-20
題目來源
題目詳情
給定一個非負整數陣列nums
,你最初位於陣列的 第一個下標 。
陣列中的每個元素代表你在該位置可以跳躍的最大長度。
判斷你是否能夠到達最後一個下標。
示例1:
輸入: nums = [2,3,1,1,4]
輸出: true
解釋: 可以先跳 1 步,從下標 0 到達下標 1, 然後再從下標 1 跳 3 步到達最後一個下標。
示例2:
輸入: nums = [3,2,1,0,4]
輸出: false
解釋: 無論怎樣,總會到達下標為 3 的位置。但該下標的最大跳躍長度是 0 , 所以永遠不可能到達最後一個下標。
提示:
1 <= nums.length <= 3 * 104
0 <= nums[i] <= 105
題解分析
解法一:暴力法
- 暴力法的思想很簡單,就是先定義一個boolean陣列,用來儲存當前位置是否可達。
- 這種方法的時間複雜度為\(O(n)\),空間複雜度為\(O(n)\)。
class Solution { public boolean canJump(int[] nums) { int n = nums.length; boolean[] dp = new boolean[n]; dp[0] = true; for(int i=0; i<n; i++){ if(dp[i]){ int now = nums[i]; for(int j=1; j <= now && (i+j) < n; j++){ dp[i + j] = true; } } } return dp[n-1]; } }
解法二:貪心法
- 貪心法的思想是維護一個【最右可達位置】,在每次迭代時維護該變數可以知道是否可以到達當前位置。
- 如果在遍歷的過程中,最右可達位置大於等於陣列最大下標則說明可以跳躍到最後的位置,否則返回false。
Either Excellent or Rustyclass Solution { public boolean canJump(int[] nums) { int n = nums.length; int right = 0; for(int i=0; i<n; i++){ if(i <= right){// 可以到達該位置 right = Math.max(right, i + nums[i]); if(right >= n-1){ return true; } } } return false; } }