[Algorithm]九章九之二:Sequence

来源:互联网 发布:淘宝如何数据选子类目 编辑:程序博客网 时间:2024/06/09 17:58

116. Jump Game:点击打开链接

思路:贪心

例如:[2,3,1,1,4]--每个位置可以跳的步数

         0,1,2,3,4 --每个位置index

分析:初始化reach=nums[0]可以跳2步,从1开始遍历i,遍历到的位置+该位置可以走的步数>=当前的reach

         更新reach值就是可以到达的位置

         直到reach大于数组最后一个位置,说明最后一个位置可以到达

public class Solution {    public boolean canJump(int[] nums) {        if(nums==null || nums.length==0){                     //这边的corner case不是必要的            return false;        }                int reach=nums[0];        for(int i=1;i<nums.length;i++){            if(reach>=i && nums[i]+i>=reach){                 //reach>=i才能使之前的reach包含新i的起步点                reach=nums[i]+i;                              //更新reach            }        }        return reach>=nums.length-1;                          //直到可以reach最后一个位置    }}
为了练习DP,LintCode降低测试数据量使可以accepted

思路:DP

例如:[2,3,1,1,4]--每个位置可以跳的步数

         0,1,2,3,4 --每个位置index

分析:从1开始遍历i,对于每个i只需要依次判断所有比i小的位置j能不能到i

         只要比i小的位置j可以到,并且从j开始可以以j能跳的步数A[j],一下跳到i或者跳过i,就表示可以跳到i

         break当前i的循环,直到遍历到数组最后一个位置,说明i从0到nums.length-1都可以到,就说明可以跳到数组最后一个位置

public class Solution {    /**     * @param A: A list of integers     * @return: The boolean answer     */    public boolean canJump(int[] A) {        boolean[] can=new boolean[A.length];        can[0]=true;                for(int i=1;i<A.length;i++){            for(int j=0;j<i;j++){                if(can[j] && A[j]+j>=i){                    can[i]=true;                    break;                }            }        }        return can[A.length-1];    }}


原创粉丝点击