D14
跳跃游戏
整体思路就是计算每一次跳跃的最远值,更新能到达的最大值mx,如果当前位置比最大值mx大,说明到不了这个地方,也就是无法跳跃到最后一个数组下标。
class Solution {
public boolean canJump(int[] nums) {
int mx = 0;
for(int i = 0; i < nums.length; i++){
if(i > mx) return false; //当前位置达不到
mx = Math.max(mx, nums[i] + i); //当前位置加上当前能到达的最远距离
}
return true;
}
}
跳跃游戏II
这是一道非常好的题目,做完这道题会对贪心和BFS有更深的理解,先贴代码吧
class Solution {
public int jump(int[] nums) {
int end = 0; // 当前跳跃到的最远地方
int farthest = 0; // 下一跳到的最远地方
int steps = 0; //记录步数
for(int i = 0; i < nums.length - 1; i++){
farthest = Math.max(farthest, nums[i] + i); // 下一跳能到达的最远距离
if(end == i){ // 到达边界,必须跳一次
steps++;
end = farthest;
}
}
return steps;
}
}
贪心的思想就是多了我也不管,我就只看当前操作是不是局部最优,也就是每次决策都保证局部最优,导向全局最优。
这道题目里,把数组想象成一条路,我只管我这一跳能到达的最远位置,不关心落到了哪个格子。
比如: 假设nums数组[2,3,1,1,4] ,i = 0时,第一跳最远到2(数组下标),我们就认为end就是第一跳的边界,是最大值。然后从0到2的这段距离就是我们可以考虑的具体跳的地方,每次都更新farthest,这代表着下一跳能到达的最远地方。直到i遍历到end的位置,这已经是第一跳能到达的最大位置了,必须下一次跳了,下一次跳直接跳到farthest,这就是贪心的过程。
有没有感觉这个过程莫名的熟悉,直到我问了GPT,他说这题可以类比成BFS(广度优先搜索)。
如果把数组看成有向图,长度就是权值,每个点就是有向图的点。
- 0->1,0->2
- 1->2, 1->3,1->4
- 2->3
- 3->4
这不就是BFS找最短路径的问题吗,我们从0可以跳到1、2,从这两个位置又能跳到其他位置,然后各种组合找出最短路径就是这个题解。而end相当于本层的最远边界,farthest相当于下一层能到达的最远边界。这样就把BFS与贪心联系起来了,而且贪心是特殊的BFS,因为我们每次选的都是最远边界。
如果这篇文章对你有所帮助,请点赞、评论、收藏,创作不易,你的支持是我创作的动力。


被折叠的 条评论
为什么被折叠?



