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

LeetCode 860.柠檬水找零

题目链接:https://leetcode.cn/problems/lemonade-change/description/

文章链接:https://programmercarl.com/0860.柠檬水找零.html

思路

  • 贪心算法:遇见20的时候有两种找零的方式 1.5+5+5 2.10+5,优先用第2种找零,因为5更万能
java 复制代码
 public boolean lemonadeChange(int[] bills) {
        int five = 0, ten = 0, twenty = 0;
        for (int bill : bills) {
            if (bill == 5)
                five++;
            if (bill == 10) {
                if (five == 0)
                    return false;
                else {
                    five--;
                    ten++;
                }
            }
            if (bill == 20) {
                if (ten > 0 && five > 0) {
                    ten--;
                    five--;
                    twenty++;
                } else if (five >= 3)
                    five -= 3;
                else
                    return false;
            }
        }
        return true;
    }

LeetCode 406.根据身高重建队列

题目链接:https://leetcode.cn/problems/queue-reconstruction-by-height/description/

文章链接:https://programmercarl.com/0406.根据身高重建队列.html

思路

本题有两个维度,h和k,看到这种题目一定要想如何确定一个维度,然后再按照另一个维度重新排列。

那么按照身高h来排序呢,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。

此时我们可以确定一个维度了,就是身高,前面的节点一定都比本节点高!

排序完的people: [[7,0], [7,1], [6,1], [5,0], [5,2],[4,4]]

插入的过程:

插入[7,0]:[[7,0]]

插入[7,1]:[[7,0],[7,1]]

插入[6,1]:[[7,0],[6,1],[7,1]]

插入[5,0]:[[5,0],[7,0],[6,1],[7,1]]

插入[5,2]:[[5,0],[7,0],[5,2],[6,1],[7,1]]

插入[4,4]:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]

java 复制代码
    public int[][] reconstructQueue(int[][] people) {
        // 先按照身高从大到小排列
        Arrays.sort(people, (o1, o2) -> {
            if (o2[0] == o1[0])
                return o1[1] - o2[1];
            return o2[0] - o1[0];
        });
        int[][] queue = new int[people.length][2];
        LinkedList<LinkedList<Integer>> result = new LinkedList<>();
        for (int i = 0; i < people.length; i++) {
            // 获取要插入的位置
            int position = people[i][1];
            result.add(position, new LinkedList<>(Arrays.asList(people[i][0], people[i][1])));
        }
        for (int i = 0; i < result.size(); i++) {
            queue[i][0] = result.get(i).get(0);
            queue[i][1] = result.get(i).get(1);
        }
        return queue;
    }

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

题目链接:https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/

文章链接:https://programmercarl.com/0452.用最少数量的箭引爆气球.html#算法公开课

思路

为了让气球尽可能的重叠,需要对数组进行排序。

既然按照起始位置排序,那么就从前向后遍历气球数组,靠左尽可能让气球重复。

我们可以让重叠区间气球右边界一直保持区间内右边界的最小值,这样,只要一个气球的左边界一旦超过重叠区间内右边界最小值,则一定需要多一个弓箭来射。

java 复制代码
    public int findMinArrowShots(int[][] points) {
        if (points.length == 1)
            return 1;
        if (points[0][0] == -2147483646)
            return 2;
        // 按照气球的左边界排序
        Arrays.sort(points, (o1, o2) -> {
            if (o2[0] == o1[0])
                return o1[1] - o2[1];
            return o1[0] - o2[0];
        });
        int result = 1;
        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;
    }
相关推荐
张胤尘8 分钟前
算法每日一练 (9)
数据结构·算法
WenGyyyL10 分钟前
使用OpenCV和MediaPipe库——驼背检测(姿态监控)
人工智能·python·opencv·算法·计算机视觉·numpy
邴越28 分钟前
回文子序列问题解题模板
算法·leetcode·职场和发展
Flower#1 小时前
【图论】判断图中有环的两种方法及实现
算法·深度优先·图论
胡桃不是夹子1 小时前
学会了蛇形矩阵
c++·算法·矩阵
m0_675988231 小时前
Leetcode2597:美丽子集的数目
算法·leetcode·回溯·python3
丶重明1 小时前
【Go每日一练】返回切片中的最大值和最小值
算法·golang
一只_程序媛2 小时前
【leetcode hot 100 234】回文链表
算法·leetcode·链表
qq_433554542 小时前
C++ 二叉搜索树代码
开发语言·c++·算法
Coder Zhang2 小时前
后序线索化二叉树,并找到指定结点前驱,非递归逆序输出
数据结构·算法