Bootstrap

贪心算法习题其二【力扣】【算法学习day.18】

前言

###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.分发糖果

题目链接:135. 分发糖果 - 力扣(LeetCode)

题面:

基本分析: 从左往右遍历,需要满足高分比低分多,从右往左遍历,同样也需要,遍历两次取最大值

代码:

class Solution {
    public int candy(int[] ratings) {
        int n = ratings.length;
        int[] left = new int[n];
        int[] right = new int[n];
        Arrays.fill(left,1);
        Arrays.fill(right,1);
        for(int i =1;i<n;i++){
            if(ratings[i]>ratings[i-1]){
                left[i]=left[i-1]+1;
            }
        }
        int sum = left[n-1];
         for(int i =n-2;i>=0;i--){
            if(ratings[i]>ratings[i+1]){
                right[i]=right[i+1]+1;
            }
            sum+=Math.max(left[i],right[i]);
        }
        
        return sum;
    }
}

2.柠檬水找零

题目链接:860. 柠檬水找零 - 力扣(LeetCode)

题面:

基本分析:优先使用掉大面值的钱

代码:

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int n = bills.length;
        int[] arr = new int[11];
       for(int c:bills){
        if(c==5){
                arr[5]++;
            }
            else if(c==10){
                if(arr[5]==0)return false;
                arr[5]--;
                arr[10]++;
            }
            else{
                if(arr[10]>0){
                    arr[10]--;
                    if(arr[5]==0)return false;
                    arr[5]--;
                }else{
                    if(arr[5]<3)return false;
                    arr[5]-=3;
                }
            }
       }
         return true;
    }
}

3.根据身高重建队列

题目链接:406. 根据身高重建队列 - 力扣(LeetCode)

题面:

基本分析:先排高的,矮的进行插队

代码:

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        int n = people.length;
        Arrays.sort(people, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[0]==o2[0])return o1[1]-o2[1];
                return o2[0]-o1[0];
            }
        });
        LinkedList<int[]> list = new LinkedList<>();
        for (int[] i : people) {
            list.add(i[1], i);
        }

        return list.toArray(new int[list.size()][2]);
    }
}

后言

上面是贪心算法的部分习题,下一篇会讲解贪心算法的其他相关力扣习题,希望有所帮助,一同进步,共勉!   

;