LeetCode高频题55. 跳跃游戏
提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目
互联网大厂们在公司养了一大批ACM竞赛的大佬们,吃完饭就是设计考题,然后去考应聘人员,你要做的就是学基础树结构与算法,然后打通任督二脉,以应对波云诡谲的大厂笔试面试题!
你要是不扎实学习数据结构与算法,好好动手手撕代码,锻炼解题能力,你可能会在笔试面试过程中,连题目都看不懂!比如华为,字节啥的,足够让你读不懂题
本题!是互联网大厂考过的笔试原题,202204月的笔试,好像是京东还是字节考的,我忘了
本题!是互联网大厂考过的笔试原题,202204月的笔试,好像是京东还是字节考的,我忘了
本题!是互联网大厂考过的笔试原题,202204月的笔试,好像是京东还是字节考的,我忘了
题目
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
一、审题
示例 1:
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/jump-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题
最大可以跳最大[i]个步数
怎么跳,随意
可以随意选走几步
最后能不能跳到N-1位置呢???
来到每一个位置i,它能在当前跳到的最远位置是?
i+[i]就是每次i达到的max【能到i就要更新,看看当前这个右边界max更大,就更新】
注意:中途你发现i压根来不了这个max【i>max】,false
当你来到i=4时,max=i+[i]=4+0=4
下一步你到i=5,发现i>max,说明你曾经压根没法跳到这里来,返回false
当i=N-1,就成功了!!!
说明中途一直没失败!!
手撕代码:
class Solution {
public boolean canJump(int[] nums) {
//复习:
//来到每一个位置i,它能在当前跳到的最远位置是?
//**i+[i]就是每次i达到的max【能到i就要更新】**
//注意:中途你发现i压根来不了这个max【i>max】,false
if (nums == null || nums.length < 2) return true;
int N = nums.length;
int max = 0;//来到i最远的右边界
for (int i = 0; i < N; i++) {
if (i > max) return false;
max = Math.max(max, i + nums[i]);//更新当前位置能到的最远右边界
}
return true;
}
}
测试:
public static void test(){
int[] arr = {2, 0, 0};
Solution solution = new Solution();
System.out.println(solution.canJump(arr));
System.out.println(solution.canJumpReview(arr));
}
public static void main(String[] args) {
test();
}
true
true
LeetCode测试;
本题的关键就是看看从左往右跳跃的过程中,咱们怎么选跳跃的步数
实际上不管你咋选,我是洗完能跳得越远越好,之前你能来到i,我就有办法从i跳到更远,当你之前怎么也没法跳到i来
就是i>maxR了,那显然不好意思,我没法从i起跳,失败了!!!
总结
提示:重要经验:
1)本题的关键就是看看从左往右跳跃的过程中,咱们怎么选跳跃的步数
实际上不管你咋选,我是洗完能跳得越远越好,之前你能来到i,我就有办法从i跳到更远,当你之前怎么也没法跳到i来
就是i>maxR了,那显然不好意思,我没法从i起跳,失败了
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。