总结反思
首先去尝试完成了一下第 55 题,跳跃游戏。
没能独立解决问题,然后看过题解之后又重新去尝试独立完成第 45 题,跳跃游戏II。结果还是没搞定。
看了题解之后发现两道题目的解题思路大同小异.
但是作为我自己,在看过第 55 题的题解之后还是没能解决第 45 题,还是有问题的。
我觉得究其原因还是自己没能透彻理解的缘故。
55.跳跃游戏
本题是判断能否到达最后一个下标,对应的元素值是当前元素可以跳跃的最大长度。
首先想到了,可以到达的最大长度这个区间内的每一个位置都要去尝试去跳跃,然后分别判断是否能够到达最后一个位置
--这样实现起来无疑是巨复杂的
现在回顾思考
- 假如我手持一个数字,数字代表了我最多可以前进距离。每前进一个单位我可以选择替换手中的数字。
- 那么我肯定要走到我能够拿到最大数字的位置,然后下一次我还是依旧要这样选择
- 这样才能够保证我走的最远
回到题目
- 观察示例一
- 开始的时候从
索引(index) = 0
开始前进,那么好,最多可以前进到index = 2
的位置因为index = 2
最多前进两步 - 很显然 前进到
index = 1
的时候可以再前进 3 步,能够走的更远
show code
class Solution {
public boolean canJump(int[] nums) {
int n = nums.length;
int dis = 0;
for(int i = 0;i < n;i++) {
// 为什么要有 i <= dis 这个判断?
// dis 表示了在一次 移动范围内,能够到达的最远位置
// 然后需要在这个范围内去判断,是否能够走的更远。
if(i <= dis) {
dis = Math.max(dis, nums[i] + i);
}
if(dis >= n - 1) {
return true;
}
}
return false;
}
}
45.跳跃游戏II
难度略微提升,需要求得最少跳几次才能跳到终点(测试用例可达终点)
回顾思考
- 从
index = 0
开始前进,索引所对应的值是可以前进的最大步数. - 那么为了尽快到达目的地,肯定每一次走的步子要最大
show code
class Solution {
public int jump(int[] nums) {
int n = nums.length;
// 所需要用的步数.
int step = 0;
// 每一次最远能够到达的距离.
int r = 0;
int end = 0;
// 最后一个元素不遍历
// 为什么?假如通过两步刚刚好到达 n - 1,会多统计一步
for(int i = 0;i < n - 1;i++) {
r = Math.max(r, i + nums[i]);
if(i == end) {
end = r;
step++;
}
}
return step;
}
}
标签:index,leet,code,55,45,int,跳跃,前进
From: https://blog.51cto.com/u_16079703/7969646