Day26 | 135分发糖果&406根据身高重建队列&55跳跃游戏&45跳跃游戏 II

77 阅读1分钟

分发糖果 LeetCode 135

题目链接:[LeetCode 135 - 困难]

思路

主要是使用两个for循环来解决,使用两次贪心的策略。

贪心:

class Solution {
    public int candy(int[] ratings) {
        int len = ratings.length;
        int[] candyVec = new int[len];
        candyVec[0]=1;
        for(int i=1;i<len;i++){
            candyVec[i]=(ratings[i]>ratings[i-1])?candyVec[i-1]+1:1;
        }
        for(int i=len-2;i>=0;i--){
            if(ratings[i]>ratings[i+1])
                candyVec[i]=Math.max(candyVec[i],candyVec[i+1]+1);
        }
        int result=0;
        for(int num:candyVec){
            result+=num;
        }
        return result;
    }
}

根据身高重建队列 LeetCode 406

题目链接:[LeetCode 406 - 中等]

思路

主要解决的是如何排序: 例子:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]

排序后:[[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]


que.add(p[1],p);

结果:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]

贪心:

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people,(a,b)->{
            if(a[0]==b[0])return a[1]-b[1];
            return b[0]-a[0];
        });

        LinkedList<int[]> que = new LinkedList<>();

        for(int[] p:people){
            que.add(p[1],p);
        }

        return que.toArray(new int[people.length][]);

    }
}

跳跃游戏 LeetCode 55

题目链接:[LeetCode 55 - 中等]

思路

贪心中的区间问题

贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点

贪心:

class Solution {
    public boolean canJump(int[] nums) {
        if(nums.length==1)return true;

        int coverRange=0;
        for(int i=0;i<=coverRange;i++){
            coverRange = Math.max(coverRange,nums[i]+i);
            if(coverRange>=nums.length-1){
                return true;
            }
        }
        return false;
    }
}

跳跃游戏 II LeetCode 45

题目链接:[LeetCode 45 - 中等]

思路

贪心的区间问题,相较于55,该题是必须会到,但是求最小的跳跃次数。

贪心:

class Solution {
    public int jump(int[] nums) {
        if(nums==null||nums.length==0|nums.length==1)return 0;
        int maxRange=0;
        int curRange=0;
        int result=0;
        for(int i=0;i<nums.length;i++){
            maxRange=Math.max(maxRange,nums[i]+i);
            if(maxRange>=nums.length-1){
                result++;
                break;
            }
            if(i==curRange){
                curRange=maxRange;
                result++;
            }
        }
        return result;
    }
}