跳跃游戏
难度 : 简单 | 中等 √| 困难 ------------------- 用时:36分钟(第一次) ------------------- 作题日期:2023-11-30
ps: 本人理解有限,以下是自我理解,官方和大佬有更完整和详细的解析!!!
题目描述
- 题目描述
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
- 案例演示
示例 1: 输入:nums = [2,3,1,1,4] 输出:true 解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。 示例 2: 输入:nums = [3,2,1,0,4] 输出:false 解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
- 提示
1 <= nums.length <= 10^4 0 <= nums[i] <= 10^5
代码及解析
第一次想法:递归暴力(已超时)
预料之内,刚开始第一次读题时,看到实例的时候,第一反应是它可以跳跃 0~nums[i] 步脑子一热就想到递归暴力求解,每次去遍历一步,看它是否能到终点,到终点返回true,否则,返回false,不出意外的超时了
public static boolean canJump(int[] nums) {
return isfa(nums, 0);
}
public static boolean isfa(int[] nums,int from){
if(from+1 == nums.length){
return true;
}else{
boolean k = false ;
for(int i = 1 ; i<=nums[from];i++){
k = isfa(nums, from+i);
if (k) {
break;
}
}
if(k){
return true;
}else{
return false;
}
}
}
第二次想法:贪心
利用max去维护可以跳跃最大的距离,每次循环判断i是否在max这个范围中,如果不在则跳过,同时还要判断max是否大于等于数组的长度,如果是说明可以跳到的最大范围超过数组一定可以到达则返回true,否则返回false。
public static boolean canJump(int[] nums) {
int max = 0;
for(int i = 0;i< nums.length;i++){
if(i<=max){
max = Math.max(max, i+nums[i]);
if(max>=nums.length){
return true;
}
}
}
return false;
}
标签:下标,游戏,nums,int,跳跃,false,true
From: https://www.cnblogs.com/kckte66/p/17867823.html