LeetCode 55. Jump Game(跳跃游戏)

题目:
在这里插入图片描述
分析:
最初我想到的是递归,为什么这题可以用递归呢?因为它的每一步都有相似的地方,比如说它的下一个落子点可以根据当前位置的nums值来得到,递归寻找后续的落子点。当有一个递归方法的传入参数为最后一个位置时,就把标志位设置为true,然后就判断标志位剪枝,没找到就通过递归继续寻找,知道所有的递归方法结束。
递归的代码:

class Solution {
    boolean flag=false;
    public boolean canJump(int[] nums) {    	
        find(nums, 0);
        return flag;
    }    
    public void find(int[] nums,int cur){
    	if(cur==nums.length-1){
    		flag=true;
    	}else if(cur>nums.length-1||nums[cur]==0||flag==true){
    		return;
    	}else{
    		for(int i=nums[cur];i>0;i--){
    			find(nums, cur+i);
    		}
    	}
    }
}

递归的缺点及改进后的思路:
很明显,这种方式类似于枚举,只要找不到目标,就会遍历所有可能情况枚举,在输入值数据复杂的情况下会超出时间限制,这不是最佳方案。需要寻找在一次遍历下解决问题的方案,题目中有这样一个信息,它说当前位置的值是可跳跃的最大长度,那么就意味着在那个最远的位置之前的区间都是可以达到的,然后如果在当前位置和这个可跳跃的最大位置之间有值可以使得nums[i]+i大于原先的最大位置,那么就更新最大位置。如果在更新中发现最大位置大于length-1,那么最后的点是可以达到的。如果出现了越不过去的0点,那么下标会在移动中超过该点,此时返回false。
改进后的代码:

public class Solution1 {
	public boolean canJump(int[] nums) {   
		 int len=0;
	     for(int i=0;i<nums.length;i++){
	    	 if(i>len){
	    		 return false;
	    	 }else{
	    		 len=(len>nums[i]+i)?len:nums[i]+i;
	    	 }
	     }
	     return true;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值