当前位置: 首页 > news >正文

Day31 第八章 贪心算法 part04

一. 学习文章及资料

  • 860.柠檬水找零
  • 406.根据身高重建队列
  • 452.用最少数量的箭引爆气球

二. 学习内容

1. 柠檬水找零

(1) 解题步骤:

有三种情况:
情况一:账单是5,直接收下。
情况二:账单是10,消耗一个5,增加一个10
情况三:账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5 
情况三这里是有贪心的。
局部最优:
遇到账单20,优先消耗美元10,完成本次找零
全局最优:完成全部账单的找零。
局部最优可以推出全局最优,并找不出反例,那么就试试贪心算法!

class Solution {
    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;
                five--;
                ten++;
            }
            if(bill==20){
                if(ten!=0&&five!=0){
                    ten--;
                    five--;
                }else if(five>=3){
                    five-=3;
                }else return false;
            }
        }
        return true;
    }
}

2. 根据身高重建队列

(1) 解题步骤:

  1. 首先按身高从大到小排序。
  2. 如果身高相同,则按 k 的值从小到大排序。
  3. 排序后的数组结构如下:身高较高的人排在前面。身高相同的人中,k 较小的排在前面
  4. 遍历排序后的数组,将每个人按照其 k 值插入到链表的指定位置。

局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性
全局最优:最后都做完插入操作,整个队列满足题目队列属性
局部最优可推出全局最优,找不出反例,那就试试贪心。

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people,(a,b)->{
            //a-b 是升序排列,b-a 是降序排列
            if(a[0]==b[0]) return a[1]-b[1];//身高相同,按k值从小到大
            return b[0]-a[0]; //身高不同,按身高从大到小
        });
        List<int[]> que=new LinkedList<>();
        for(int[] p:people){
            que.add(p[1],p); //将p向前插入到index为k的位置
        }
        return que.toArray(new int[people.length][]);
    }
}

     

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

(1) 解题思路:

局部最优:当气球出现重叠,一起射,所用弓箭最少
全局最优:把所有气球射爆所用弓箭最少

因为要尽可能射多的气球,每次到下一个气球如有重叠,就要更新最小右边界,就是最小可以一起射爆的位置

                   

(2) 解题步骤:

  1. 排序:使用 Arrays.sort() 将气球数组按起始坐标 a[0] 升序排列。这样可以确保我们按顺序处理每个气球。
  2. 初始化:count 初始化为1,因为至少需要一支箭(如果数组不为空)。
  3. 遍历气球数组:从第二个气球开始遍历。对于每个气球 i,比较其起始坐标 points[i][0] 与前一个气球的结束坐标 points[i-1][1]。
    如果当前气球的起始坐标大于前一个气球的结束坐标(即两个气球不重叠),则需要增加箭的数量。
    如果重叠,则更新当前气球的结束坐标为两者中的最小值,以确保后续的箭能够覆盖更小的重叠区域。
class Solution {
    public int findMinArrowShots(int[][] points) {
        if(points.length==0) return 0;
        int result=1;
        // 根据气球直径的开始坐标从小到大排序
        // 使用Integer内置比较方法,不会溢出
        Arrays.sort(points,(a,b)->Integer.compare(a[0],b[0]));
        for(int i=1;i<points.length;i++){
            // 气球i和气球i-1不挨着,注意这里不是>=
            if(points[i][0]>points[i-1][1]){
                result++;
            }else{
                // 更新重叠气球最小右边界
                points[i][1]=Math.min(points[i][1],points[i-1][1]);
            }
        }
        return result;
    }
}

相关文章:

  • 进程间通信 —— 共享内存
  • 数字电子电路基础第三章——门电路(一)
  • MySQL--DQL、DML、DDL、DCL概念与区别
  • 硬编码(三)经典变长指令一
  • 2011-2019年各省电信业务总量数据
  • [STM32]从零开始的STM32 DEBUG问题讲解及解决办法
  • 利用three.js在Vue项目中展示重构的stl模型文件
  • Grafana接入Zabbix数据源
  • java23种设计模式-状态模式
  • 超越期望:提供超越标准的客户服务
  • Flume
  • 【Kubernetes】 Scheduler 的逻辑:从 Predicates/Priorities 到 Filter/Score
  • 微深节能 高炉废渣车天车精确定位系统 格雷母线
  • 使用CSS3DRenderer/CSS2DRenderer给模型上面添加html标签的一个demo
  • 3.1部署filebeat:5044
  • 2025年光电科学与智能传感国际学术会议(ICOIS 2025)
  • 可视化的决策过程:决策树 Decision Tree
  • 良田S500L高拍仪对接
  • STM32之时钟树
  • DeepSeek开源周Day5: 3FS存储系统与AI数据处理新标杆
  • 珠海网站建设及优化/百度网页排名怎么提升
  • 做网站的方法/百度开户联系方式
  • wordpress论坛系统/微信搜索seo优化
  • 亚马逊雨林是怎么形成的/多少关键词排名优化软件
  • 怎么做物物交换网站/广州网站维护
  • 怎样做同性恋女视频网站/百度电话客服24小时人工