55. 跳跃游戏

本文介绍了跳跃游戏中的一种解题思路,利用贪心思想结合从后往前遍历的方法来解决问题。重点在于只关注数组中0的位置,通过后向遍历更新可达范围,如果最后可达范围包括起始点,则表明可以到达终点。
摘要由CSDN通过智能技术生成

#55. 跳跃游戏

2020/4/17每日一题打卡 难度:中等

题目描述
在这里插入图片描述
解题思路

1、贪心思想

在这里插入图片描述

public boolean canJump(int[] nums) {       
	int n = nums.length;         
	if(n <= 1)             
		return true;         
	int max = nums[0];  //记录当前可以到达的最远长度         
	for (int i = 1; i < n - 1; i++) {             
		if (max >= i) {  //如果当前位置能到达,如果nums[i]小于max则说明当前位置都不能到                 
			max = Math.max(max, i + nums[i]);            
		}             
		else {                
			return false;            
		}            
		if(max >= n-1)   //如果已经能到达最后,返回,减少比较次数                
			return true;        
		}
	}         
	return max >= n - 1;    
}

在这里插入图片描述

2、从后往前遍历

看执行时间1ms的大佬的方法,从后面往前遍历,更新能到达的位置,如果最后等于0则说明可以从起点到终点。大佬实在是太强了

public boolean canJump(int[] nums) {        
	int last = nums.length - 1;  //最后能到达的下标         
	for (int i = nums.length - 1; i >= 0; i--) {            
		if(i+nums[i] >= last) { //如果能到达                
			last = i;            
		}         
	}         
	return last == 0;  //last = 0则表示能到从第一个到最后一个    
}

在这里插入图片描述

3、只关注0的位置

还有一种思路就是,如果全部数组都不等于0,那么肯定满足要求。如果遇到0,那么就往前搜寻有没有位置能跳过这个0。

public static boolean canJump2(int[] nums) {
   	if(nums.length <= 1)
             return true;
   	for (int i = 0; i < nums.length - 1; i++) {
	   	if(0 == nums[i]) {
	    		int j = i;
	    		for (; j >= 0; j--) {
	     			if(nums[j] + j > i) {
	      				j = -2;//标记找到
	      				break;
	     			}
	    		}
	    		if(j != -2) return false;
	   	}
	   }	
	return true;  
     }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值