優質博文:IT-BLOG-CN
一、題目
給你一個非負整數數組nums
,你最初位于數組的第一個下標 。數組中的每個元素代表你在該位置可以跳躍的最大長度。判斷你是否能夠到達最后一個下標,如果可以,返回true
;否則,返回false
。
示例 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 <= 104
0 <= nums[i] <= 105
二、代碼
貪心: 提取題目重要信息可知:【1】當前下表i
+ 值nums[i]
是否可以到達下一個坐標i + 1
,當然之前的i + nums[i] >= 5
的時候,表示前5
個都可達;【2】只有滿足1的條件時,如果可達 > 最大的下標,則直接返回true
否則,不斷遍歷獲取最大值,直到大于最大下標返回true
或者遍歷結束返回false
;
class Solution {public boolean canJump(int[] nums) {if (nums == null || nums.length == 0) {return false;}int len = nums.length;int pathlen = 0;// 如果可達路徑大于等于下表表示可達,則判斷是否大于數組的長度-1;for (int i = 0; i < len; i++) {if (pathlen >= i) {pathlen = Math.max(pathlen, i + nums[i]);if (pathlen >= len - 1) {return true;}}}return false;}
}
時間復雜度: O(n)
,其中n
為數組的大小。只需要訪問nums
數組一遍,共n
個位置。
空間復雜度: O(1)
,不需要額外的空間開銷。