代码随想录算法训练营第35天|860.柠檬水找零、406.根据身高重建队列、452.用户最少数量的箭引爆气球

代码随想录算法训练营第35天|860.柠檬水找零、406.根据身高重建队列、452.用户最少数量的箭引爆气球

  • 一. 贪心算法相关题目
    • 860.柠檬水找零
      • 贪心
        • 思路
    • 406.根据身高重建队列
      • 贪心
        • 思路
    • 452.用户最少数量的箭引爆气球
      • 贪心
        • 思路

一. 贪心算法相关题目

860.柠檬水找零

贪心

思路

  • 题目中限制只有可能出现5、10、20面额的钱,
  • 只需要缓存收到的面额为5,和10 的因为不需要用20的找零
  • 优先使用10面额的找零,因为5面额的更灵活
class Solution {
    public boolean lemonadeChange(int[] bills) {
        int five = 0, ten = 0; //记录5和10面值的数量,不用记录20的因为不会用20找零
        for (int bill : bills) {
            if (bill == 5) {
                five++;
            }
            if (bill == 10){
                if (five<=0 )return false;
                five --;
                ten ++;
            }
            if (bill == 20){
                if (ten>0 && five>0){
                    ten--;
                    five--;
                }else if (five>2){
                    five = five -3;
                }else return false;
            }
        }


        return true;
    }
}

406.根据身高重建队列

贪心

思路

  • 因为每个人的第二个元素代表前面是多少个比自己高的,所以根据身高从大到小排序
  • 身高相同的前面人数小的在前面
  • 然后创建一个链表不断根据前面人数当作插入索引插入链表位置

代码随想录算法训练营第35天|860.柠檬水找零、406.根据身高重建队列、452.用户最少数量的箭引爆气球_第1张图片

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        //身高从大到小排序,身高相同k小的在前面
        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[] person : people) {
            que.add(person[1],person);
        }
        return que.toArray(new int[people.length][]);
    }
}

452.用户最少数量的箭引爆气球

贪心

思路

  • 首先根据气球的开始坐标从小到大排序
  • 然后遍历气球,判断前后两个气球是否有重合部分如果重合就能引爆,如果不重合需要增加一支箭
  • 另外如果重合的话箭至少要指向右边界的最小值才能引爆,所以需要更新最小右边界

代码随想录算法训练营第35天|860.柠檬水找零、406.根据身高重建队列、452.用户最少数量的箭引爆气球_第2张图片

class Solution {
    public int findMinArrowShots(int[][] points) {
        if (points.length == 0) return 0;
        //使用气球的开始坐标从小到大排序
        Arrays.sort(points, Comparator.comparingInt(a -> a[0]));
        int result = 1; //如果points长度不为0时至少需要一支箭
        for (int i = 1; i < points.length; i++) {
            // 如果当前气球的左边界跟前一个气球的有边界没有挨着,不会引爆,箭数加一
            if (points[i][0] > points[i-1][1]){
                result ++;
            }else {
                //更新最小右边界
                points[i][1] = Math.min(points[i][1],points[i-1][1]);
            }
        }
        return result;
    }
}

你可能感兴趣的:(代码随想录算法营,算法,贪心算法,leetcode)