欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

55. 跳跃游戏

程序员文章站 2024-03-15 09:04:17
...

#55. 跳跃游戏

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

题目描述
55. 跳跃游戏
解题思路

1、贪心思想

55. 跳跃游戏

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;    
}

55. 跳跃游戏

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则表示能到从第一个到最后一个    
}

55. 跳跃游戏

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;  
     }

55. 跳跃游戏

相关标签: 力扣刷题笔记