LeetCode55 跳跃游戏
题目
解题
解题一:贪心算法-从左往右
当 i > rightmost 时,含义为 i 位置不可到达,因此不能更新 rightmost。
// javascript
var canJump = function(nums) {
const n = nums.length;
let rightmost = 0;
for (let i = 0; i < n; i++) {
if (i <= rightmost) {
rightmost = Math.max(rightmost, i + nums[i]);
if (rightmost >= n - 1) {
return true;
}
}
}
return false;
};
因为 i
是单调递增的,一旦某个 i > rightmost
,rightmost
在此位置无法更新,后面的 i
必定 > rightmost
,所以可以提前结束循环(加判断条件 i <= rightmost
),结果为 false
;又因为 rightmost >= n - 1
时(加判断条件 rightmost < n - 1
),可以提前结束循环,结果为 true
。和在一起变成 i <= rightmost < n - 1 < n
。
// javascript
var canJump = function(nums) {
const n = nums.length;
let rightmost = 0;
for (let i = 0; i <= rightmost && rightmost < n - 1; i++) {
rightmost = Math.max(rightmost, i + nums[i]);
}
return rightmost >= n - 1;
};
解题二:贪心算法-从右往左
从右往左更新 最左 的能到达 nums[nums.length - 1] 的位置,这种写法的缺点是不能提前结束循环,一定要遍历到最左边。
// javascript
var canJump = function(nums) {
const n = nums.length;
let leftmost = n - 1;
for (let i = n - 2; i >= 0; i--) {
if (i + nums[i] >= leftmost) {
leftmost = i;
}
}
return leftmost === 0;
};