publicstaticbooleancanJump(int[] nums){ if (nums == null || nums.length == 0) { returnfalse; } if (nums.length == 1) { returntrue; } int[] res = newint[nums.length]; res[0] = 1; for (int i = 0; i < nums.length - 1; i++) { if (res[i] == 0) { returnfalse; } int jumpSize = nums[i]; for (int j = 1; j <= jumpSize; j++) { if ((i + j) < nums.length) { res[i + j] = 1; } else { returntrue; } } } return res[nums.length - 1] == 1; }
标记历史位置可达的最大位置
遍历数组, 使用变量存储当前位置可以到达的最大下标
如果当前位置的下标比历史最大下标小, 所以当前位置不可达.
否则比较历史最大下标与 (i+nums[i])的值, 取最大值作为最大可达下标
如果最大可达下标超过数组长度, 提前返回true
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13
publicbooleancanJump(int[] nums){ int n = nums.length; int currentMaxAvailableIndex = 0; for (int i = 0; i < n; i++) { if (i <= currentMaxAvailableIndex) { currentMaxAvailableIndex = Math.max(currentMaxAvailableIndex, i + nums[i]); if (currentMaxAvailableIndex >= n - 1) { returntrue; } } } returnfalse; }