leetcode(55):Jump Game

本文介绍了一个经典的算法问题——跳跃游戏。通过两种不同的方法探讨了如何判断能否从数组的起始位置到达最后一个元素,并给出了具体的Java实现。第一种方法使用布尔数组记录可达状态,第二种方法优化了状态转移方程,提高了效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题:
Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

For example:
A = [2,3,1,1,4], return true.
A = [3,2,1,0,4], return false.

分析:给定一个非负整数数组,下标起始位置为第一个元素,判断能否通过根据数组的元素大小跳跃到达最后一个元素,例如例子1中在第一个元素位置可以最多跳跃两个元素,在第二个元素位置最多可以跳跃三个元素,以此类推,直到到达最后一个元素。

直观的思路是设置一个长度为数组nums的长度大小的布尔数组flag[],来记录该位置的元素是否有可达。初始状态全部设置为false,即为不可达。
遍历nums数组,根据元素的数字大小,将后续能到达的元素设置为true,即为可达状态。遍历完之后判断最后一个元素的状态是否可达。
Java代码如下:

public boolean canJump(int[] nums){
        int len = nums.length;
        boolean[] flag = new boolean[len];
        for (int i = 0; i < flag.length; i++) {
            flag[i]=false;
        }
        flag[0]=true;
        for (int i = 0; i < nums.length; i++) {
            if(flag[i]){
                for (int j = 1; j <= nums[i] && (i+j)<nums.length; j++) {
                    flag[i+j]=true;
                }
            }
        }
        return flag[len-1];
    }

时间复杂度为O(n^2),空间复杂度为O(n),显然,在大数据量的情况下会出现超时Time Limit Exceeded。

改进的思路:

flag这个数组不再单纯地存可达或不可达这样的bool值,而是存储从0位置出发的最大可达长度。定义数组int canWalkLength[n],canWalkLength[i]表示到达 i 位置后,依然有余力走出的最大长度。如果canWalkLength[i] < 0,表示走不到位置i。

状态转移方程为:canWalkLength[i] = max(canWalkLength[i-1], nums[i-1]) - 1

java实现:时间复杂度为O(n),空间复杂度为O(n)

public boolean canJump(int[] nums){
        int len = nums.length;
        if(nums[0]>=len-1) return true;
        int[] canWalkLength=new int[len];
        canWalkLength[0]=nums[0];
        for (int i = 1; i < nums.length; i++) {
            canWalkLength[i]=Math.max(canWalkLength[i-1], nums[i-1])-1;
            if(canWalkLength[i]<0) return false;
        }
        return canWalkLength[len-1]>=0;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值