Jump Game--LeetCode

来源:互联网 发布:udp源端口号 编辑:程序博客网 时间:2024/06/01 08:53

题目:

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.

思路:这里可以看成是DP问题,但是DP问题选择的切入点可能不同。遍历到某一个节点,如果知道当前节点位置能跳到的最远位置,那么遍历到结束即可知道能否跳到结束的位置,那么到当前节点能跳到的最远位置是什么,可能是从当前节点来跳,也可能是之前节点的跳到的最远位置。

这道题是动态规划的题目,所用到的方法跟是在Maximum Subarray中介绍的套路,用“局部最优和全局最优解法”。我们维护一个到目前为止能跳到的最远距离,以及从当前一步出发能跳到的最远距离。局部最优local=A[i]+i,而全局最优则是global=Math.max(global, local)。递推式出来了,代码就比较容易实现了。因为只需要一次遍历时间复杂度是O(n),而空间上是O(1)。代码如下: 

    public boolean canJump(int[] A) {          if(A==null || A.length==0)              return false;          int reach = 0;          for(int i=0;i<=reach&&i<A.length;i++)          {             if(readh >= i+1)            reach = Math.max(A[i]+i,reach);          }          if(reach<A.length-1)              return false;          return true;      }  


这个思路是没有错误的,但是后来我发现实现中有点问题,在判断

 reach = Math.max(A[i]+i,reach);  
这个的时候首先得判断能不能达到i这个位置,也就是说需要判断reach是否大于A[i],然后才有这么一句

这也是一道比较经典的动态规划的题目,不过不同的切入点可能会得到不同复杂度的算法,比如如果维护的历史信息是某一步是否能够到达,那么每一次需要维护当前变量的时候就需要遍历前面的所有元素,那么总的时间复杂度就会是O(n^2)。所以同样是动态规划,有时候也会有不同的角度,不同效率的解法。

ps:如果一时想不起来上面这种思考,还有一种更加简单明了的思考,如果我们使用一个数组记录了从第一个位置能否挑战到当前这个位置,这个数组为flag[i],那么从第一个位置就开始更需后序的flag[i],因为第一个位置中的数说明了最多可以跳跃的次数,由当前flag[i]和当前位置能够跳跃的最大次数,可以更新flag数组的后续位置,只需要查看flag中最后一个标志位便可以判断能够达到最后那个位置。


1 0
原创粉丝点击