day35 算法训练|贪心算法 part04

860.柠檬水找零

  • 情况一:账单是5,直接收下。
  • 情况二:账单是10,消耗一个5,增加一个10
  • 情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5

情况三处有贪心,先用10来还,不行的话再用5。因为5既可以用来找10还可以用来找20,但是10只能用来找20

java 复制代码
class Solution {
    public boolean lemonadeChange(int[] bills) {
        int five = 0;
        int ten = 0;

        for (int i = 0; i < bills.length; i++) {
            if (bills[i] == 5) {
                five++;
            } else if (bills[i] == 10) {
                five--;
                ten++;
            } else if (bills[i] == 20) {
                if (ten > 0) {
                    ten--;
                    five--;
                } else {
                    five -= 3;
                }
            }
            if (five < 0 || ten < 0) return false;
        }
        
        return true;
    }
}

406.根据身高重建队列

有两个维度需要同时考虑的时候先考虑其中之一,再考虑另一个

先确定h还是先确定k?

如果先确定k,不仅k没有排好,h也没有排好,并不合适。

先确定h顺序,再确定k,我们有了h的先后顺序,我们可以保证,在当前之前安排好的身高都比当前身高高,再就只用考虑到k的顺序了

图源:代码随想录

  • 插入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 复制代码
class Solution {
    public int[][] reconstructQueue(int[][] people) {
        // 身高从大到小排(身高相同k小的站前面)
        Arrays.sort(people, (a, b) -> {
            if (a[0] == b[0]) return a[1] - b[1];   // a - b 是升序排列,故在a[0] == b[0]的狀況下,會根據k值升序排列
            return b[0] - a[0];   //b - a 是降序排列,在a[0] != b[0],的狀況會根據h值降序排列
        });

        LinkedList<int[]> que = new LinkedList<>();

        for (int[] p : people) {
            que.add(p[1],p);   //Linkedlist.add(index, value),會將value插入到指定index裡。
        }

        return que.toArray(new int[people.length][]);
    }
}

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

由于范围数值可能在整型边界,所以在比较的时候应该用Integer自带的比较器

Integer.compare(a0, b0);

局部最优:让气球尽可能的重叠

如果两个气球重叠,我们可以更新两个气球的右边界为两个右边界的最小值,故两个右边界的最小值之前一定需要一支弓箭。如果下一个气球,与前两个气球的重叠处还重叠(start3<min(end1,end2)),则三个气球重叠,不需要多一个箭来射破气球。否则,需要多一个箭来负责新的那个气球

java 复制代码
/**
 * 时间复杂度 : O(NlogN)  排序需要 O(NlogN) 的复杂度
 * 空间复杂度 : O(logN) java所使用的内置函数用的是快速排序需要 logN 的空间
 */
class Solution {
    public int findMinArrowShots(int[][] points) {
        // 根据气球直径的开始坐标从小到大排序
        // 使用Integer内置比较方法,不会溢出
        Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));

        int count = 1;  // points 不为空至少需要一支箭
        for (int i = 1; i < points.length; i++) {
            if (points[i][0] > points[i - 1][1]) {  // 气球i和气球i-1不挨着,注意这里不是>=
                count++; // 需要一支箭
            } else {  // 气球i和气球i-1挨着
                points[i][1] = Math.min(points[i][1], points[i - 1][1]); // 更新重叠气球最小右边界
            }
        }
        return count;
    }
}
相关推荐
Jack201 小时前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树3 小时前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE21219 小时前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE21219 小时前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术1 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦1 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050731 天前
(一)小红的数组操作
算法·编程语言
怕浪猫1 天前
Electron 系列文章封面图
算法·架构·前端框架
徐小夕1 天前
JitWord 3.0 正式发布,高精度Word异构解析+复杂组件兼容,打造web端协同Word编辑器
前端·vue.js·算法