代码随想录算法训练营第三十六天| 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;
    }
相关推荐
鸽鸽程序猿1 分钟前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd1 分钟前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo6175 分钟前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v10 分钟前
leetCode43.字符串相乘
java·数据结构·算法
A懿轩A1 小时前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
古希腊掌管学习的神1 小时前
[搜广推]王树森推荐系统——矩阵补充&最近邻查找
python·算法·机器学习·矩阵
云边有个稻草人1 小时前
【优选算法】—复写零(双指针算法)
笔记·算法·双指针算法
半盏茶香1 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
忘梓.2 小时前
解锁动态规划的奥秘:从零到精通的创新思维解析(3)
算法·动态规划
tinker在coding4 小时前
Coding Caprice - Linked-List 1
算法·leetcode