代码随想录算法训练营第三十六天| 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;
    }
相关推荐
蜡笔小新..17 分钟前
某些网站访问很卡 or 力扣网站经常进不去(2025/3/10)
算法·leetcode·职场和发展
IT猿手1 小时前
2025最新群智能优化算法:基于RRT的优化器(RRT-based Optimizer,RRTO)求解23个经典函数测试集,MATLAB
开发语言·人工智能·算法·机器学习·matlab
刘大猫261 小时前
五、MyBatis的增删改查模板(参数形式包括:String、对象、集合、数组、Map)
人工智能·算法·智能合约
修己xj1 小时前
算法系列之深度/广度优先搜索解决水桶分水的最优解及全部解
算法
_GR2 小时前
2019年蓝桥杯第十届C&C++大学B组真题及代码
c语言·数据结构·c++·算法·蓝桥杯
დ旧言~2 小时前
贪心算法三
算法·leetcode·贪心算法·动态规划·推荐算法
郭涤生3 小时前
在线程间共享数据_第三章_《C++并发编程》笔记
c++·笔记·算法
肖筱小瀟3 小时前
2025-3-9 leetcode刷题情况(贪心算法--序列问题)
算法·leetcode·贪心算法
.ccl3 小时前
蓝桥杯省赛真题C++B组-裁纸刀2022
算法·职场和发展·蓝桥杯
DitanZ3 小时前
代码随想录 回溯
数据结构·算法