代码随想录算法训练营第三十六天| 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,24,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;
    }
相关推荐
kkeeper~1 小时前
0基础C语言积跬步之数据在内存中的存储
c语言·数据结构·算法
wabs6662 小时前
关于贪心算法的一些自我总结【力扣45.跳跃游戏II】【灵感来源:代码随想录】
算法·贪心算法·复盘
2401_876964133 小时前
【湖北专升本】2026湖北专升本真题PDF+备考资料汇总
数据结构·人工智能·经验分享·深度学习·算法·计算机视觉
嗝o゚3 小时前
CANN GE 算子融合——融合算法与调度策略
算法·昇腾·cann·ge
小江的记录本3 小时前
【JVM虚拟机】垃圾回收GC:垃圾回收算法:标记-清除、标记-复制、标记-整理、分代收集(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·算法·安全·面试
Ulyanov5 小时前
用声明式语法重新定义Python桌面UI:QML+PySide6现代开发入门(一)
开发语言·python·算法·ui·系统仿真·雷达电子对抗仿真
数据科学小丫5 小时前
特征工程处理
人工智能·算法·机器学习
z落落5 小时前
C#参数区别
java·算法·c#
c238566 小时前
vector(下)
数据结构·算法
z落落6 小时前
C# 冒泡排序+选择排序 + Array.Sort 自定义排序
数据结构·算法