代码随想录算法训练营第三十六天| 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;
    }
相关推荐
sewinger7 分钟前
区间合并算法详解
算法
XY.散人10 分钟前
初识算法 · 滑动窗口(1)
算法
韬. .31 分钟前
树和二叉树知识点大全及相关题目练习【数据结构】
数据结构·学习·算法
Word码36 分钟前
数据结构:栈和队列
c语言·开发语言·数据结构·经验分享·笔记·算法
五花肉村长40 分钟前
数据结构-队列
c语言·开发语言·数据结构·算法·visualstudio·编辑器
一线青少年编程教师1 小时前
线性表三——队列queue
数据结构·c++·算法
Neituijunsir1 小时前
2024.09.22 校招 实习 内推 面经
大数据·人工智能·算法·面试·自动驾驶·汽车·求职招聘
希望有朝一日能如愿以偿2 小时前
力扣题解(飞机座位分配概率)
算法·leetcode·职场和发展
丶Darling.2 小时前
代码随想录 | Day26 | 二叉树:二叉搜索树中的插入操作&&删除二叉搜索树中的节点&&修剪二叉搜索树
开发语言·数据结构·c++·笔记·学习·算法
JustCouvrir2 小时前
代码随想录算法训练营Day15
算法