Leetcode 55 Jump Game && 45 Jump Game II

本文解析了两种跳跃游戏算法问题:一种是判断能否到达数组末尾,通过维护可达位置来优化性能;另一种是最小跳跃次数到达末尾的问题,采用动态更新策略实现。文中提供了具体的实现代码。

摘要生成于 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.

基本思路:类似于加油站问题 每次往后走一步 步数减少 若当前位置跳数大于pos,则置换pos。若出现步数加上当前位置大于等于长度,则返回true。

  public boolean canJump(int[] nums) {
     int pos = nums[0];
    	int len = nums.length-1;
    	if(pos >= len)return true;
    	if(pos == 0)return false;
    	for (int i = 1; i <= len; i++) {
    		if(pos == 0)return false;
    		pos--;//pos为当前可行进的步数  故每次循环减一  类似于加油站问题
			if(nums[i]>pos){
				pos = nums[i];
			}
			if(pos + i>=len){
				return true;
			}
		}
     return false;   
    }

Jump Game II

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.

Your goal is to reach the last index in the minimum number of jumps.

For example:
Given array A = [2,3,1,1,4]

The minimum number of jumps to reach the last index is 2. (Jump 1 step from index 0 to 1, then 3 steps to the last index.)

Note:
You can assume that you can always reach the last index.

实现思路:设置两个查找指针,选择能跳的范围内的最大跳数,然后更新指针,从而得出结果,但是效率较低,最终没通过测试。

代码如下:

 public int jump(int[] nums){
    	int pos = 0;
    	int len = nums.length-1;
    	int steps = 0;
    	int s1 = 1;
    	int s2 = nums[0];
    	int jum = 0;//当前最远跳数 s1到s2之间
    	int mPos = 0;//记录当前能跳最远的位置
    	if(s2 >= len&&len!=0)return 1;
    	if(len==0)return 0;
    	while(pos<=len){
    		//发现远跳点 修改jum值
    		if(nums[s2]>jum){
    			mPos = s2;
    			jum = nums[s2];
    		}
    		//搜寻结束 选择新的pos点继续
    		if(s1==s2){
    			//修改s1 s2继续
    			s1 = mPos+1;
    			s2 = nums[mPos]-1+s1;
    			steps++;
    			jum = 0;
        		pos = mPos;
    		}else{
        		s2--;
    		}

    		if(nums[pos]+pos >= len){
    			return steps+1;
    		}
    	}
        return steps;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值