Leetcode55 & 45 跳跃游戏

151 阅读1分钟

image.png

class Solution {
    //递归+记忆集
    public boolean canJump(int[] nums) {
        return recur(0,nums,new int[nums.length])==1?true:false;
    }

    public int recur(int n,int[] nums,int[] visited){
        if(n==nums.length-1 || visited[n]==1) return 1;
        if(n<0||n>nums.length-1 || visited[n]==-1) return -1;
        visited[n] = -1;
        for(int i=1;i<=nums[n];i++){
            if(recur(n+i,nums,visited)==1) {
                visited[n] = 1;
                return 1;
            }
        }
        return -1;
    }

    //贪心算法
    public boolean canJump(int[] nums) {
        int max=nums[0];
        for(int i=0;i<nums.length;i++){
            if(i>max) return false;
            if(max>=nums.length-1) return true;
            max = Math.max(max,i+nums[i]);
        }
        return false;
    }
}

和上一个Leetcode55题的区别就是加了一个最少跳跃次数,仍然用贪心算法即可

image.png

class Solution {
    public int jump(int[] nums) {
        int endPosision = 0,maxPosition = 0,steps = 0;
        for(int i=0;i<nums.length-1;i++){
            maxPosition = Math.max(maxPosition,nums[i]+i);
            if(i==endPosision){
                endPosision = maxPosition;
                steps++;
            }
        }
        return steps;
    }
}