55. 跳跃游戏

解题思路

一切都可以用暴力解决。

读完题之后,感觉并没有动态规划的思想,而用贪心思想做就好了。

本题主要是判断能不能跳到最后,那么我们就暴力呗,从第 2 个位置开始跳,核心点在于当前位置之前的都是能跳到的。

那么当前位置能不能跳到,就判断从当前位置的前一个位置往前逐一找,看能不能调到当前位置,只要跳不到,直接返回 false 即可,那么当每个路段都能跳到之后,才能为 true。

/**
* @param {number[]} nums
* @return {boolean}
*/
var canJump = function(nums) {
let isOk = true;
for(let i=1;i<nums.length&&isOk;i++){
for(let j=i-1;j>=0;j--){
if(nums[j] >= i-j){
isOk = true;
break;
}
else {
isOk = false;
}
}
}
return isOk;
};

45. 跳跃游戏 II

解题思路

本题保证能够跳到最后,然后是计算最小跳跃次数。

我用 endPos 记录我每选择跳一步能够走的最远距离,然后在这个最远距离内,不断地寻找下一步能够跳的最远距离,即:

curEndPos = Math.max(curEndPos, i+nums[i]);

如果我发现在上一步能够跳的这个最远距离内寻找下一步跳的距离能够 大于或等于 终点位置,直接加一步,然后不用循环走了,这也是一个剪枝优化点。

if(i+nums[i] >=nums.length-1) {
cnt++;
break;
}

当我走到上一步能够跳的最远距离末端的时候,就要想着我要走下一步了,是不是应该选择下一步能够跳的最远距离,因此:

if(i == endPos) {
endPos = curEndPos;
cnt++;
}
/**
* @param {number[]} nums
* @return {number}
*/
var jump = function(nums) {
let cnt = 0; // 返回的最小步数
let endPos = 0; // 记录最远距离
let curEndPos = 0; // 记录当前能跳的最远距离
for(let i=0;i<nums.length-1;i++) {
curEndPos = Math.max(curEndPos, i+nums[i]);
if(i+nums[i] >=nums.length-1) {
cnt++;
break;
}
if(i == endPos) {
endPos = curEndPos;
cnt++;
}
}
return cnt;
};

学如逆水行舟,不进则退