跳跃游戏

跳跃游戏

难度 : 简单 | 中等 | 困难 ------------------- 用时: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;
    }
posted @ 2023-11-30 17:13  kte66  阅读(25)  评论(0)    收藏  举报