Leetcode 55. Jump Game

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.

要判断是否可以到达最后一个点,可以先找到可以到达最后的那个节点i,然后再去看i前面的节点能不能到达i,如此循环下去直到找到i=0的那一点:

	public boolean canJump(int[] nums) {
        int n = nums.length;
        int all = n-1;//当前需要到达的位置
        for(int i=0;i<all;i++)
        {
        	if(i+nums[i]>=all)
        	{
        		all = i;
        		i=-1;//从0开始遍历找到第一个到达all的节点
        	}
        }
        
        return all==0;
 }   

但是上述的代码会超时,因为你每更新all一次都要从0开始找第一个到达all的节点,所以我们可以进行优化

优化1:

我们可以从最后节点开始往前找,那么每次就不用从投开始遍历了,要知道能否到达n-1,就看一下最后一个可以到达n-1的点是哪个i,然后再看最后一个到达i的点是哪个,知道i=0,只用从后往前遍历一次就好:

	public boolean canJump(int[] nums) {
      	    //7ms    
	     int n = nums.length;
	     int all = n-1;
	     for(int i=n-1;i>=0;i--)
	     {
	        if(i+nums[i]>=all) all = i;//当前的节点不能到达
	     }
	        
	        return true;
 } 


另一种算法是,我们从0开始找,看每次能到达的最远节点是哪,用farest来表示,那只要当前节点i是farest能到达的,就能更新farest,知道farest到达n-1。

	public boolean canJump(int[] nums) {
      	    //9ms    
	     int n = nums.length;
	     int farest = 0;
	     for(int i=0;i<n;i++)
	     {
	        if(farest<i) return false;//当前的节点不能到达
	        farest = Math.max(farest, i+nums[i]);
	        if(farest>=n-1)
	        	return true;
	     }
	        
	        return true;
 } 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值