Day31 第八章 贪心算法 part04

devtools/2025/3/4 13:08:48/

一. 学习文章及资料

  • 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;}
}


http://www.ppmy.cn/devtools/164458.html

相关文章

NO.19十六届蓝桥杯模拟赛第三期上

1 如果一个数 p 是个质数&#xff0c;同时又是整数 a 的约数&#xff0c;则 p 称为 a 的一个质因数。 请问&#xff0c; 2024 的最大的质因数是多少&#xff1f; 答&#xff1a;23 #include <bits/stdc.h> using namespace std;int main() {ios::sync_with_stdio(false)…

DevOps原理和实现面试题及参考答案

解释 DevOps 的核心目标与文化价值观,如何理解 “CAMS” 模型? DevOps 的核心目标是打破开发(Development)和运维(Operations)之间的壁垒,通过自动化、协作和持续反馈,实现软件的快速、可靠交付,以更好地满足业务需求和客户期望。具体来说,DevOps 旨在缩短软件的交付…

记录一次跨库连表的坑

一、背景 1. 业务背景 一个微服务项目&#xff0c;本次业务主要涉及两个板块&#xff0c;分别是 文章管理 和 系统管理。具有开发环境、测试环境、生产环境三个环境。其中&#xff0c;开发环境和测试环境用的是同一个服务器&#xff08;nacos和MySQL都是用的同一个服务器中的…

用Python+Flask打造可视化武侠人物关系图生成器:从零到一的实战全记录

用PythonFlask打造可视化武侠人物关系图生成器&#xff1a;从零到一的实战全记录 一、缘起&#xff1a;一个程序小白的奇妙探索之旅 作为一个接触Python仅13天的编程萌新&#xff0c;我曾以为开发一个完整的应用是遥不可及的事情。但在DeepSeek的帮助下&#xff0c;我竟用短短…

Linux总结

1 用户与用户组管理 1.1 用户与用户组 //linux用户和用户组 Linux系统是一个多用户多任务的分时操作系统 使用系统资源的用户需要账号进入系统 账号是用户在系统上的标识&#xff0c;系统根据该标识分配不同的权限和资源 一个账号包含用户和用户组 //用户分类 超级管理员 UID…

机器学习基础概念详解:从入门到应用

在机器学习领域&#xff0c;掌握基础概念是理解复杂模型和应用场景的关键。本文将以简洁的方式介绍机器学习的核心概念&#xff0c;帮助读者快速构建知识框架。 一、数据集的划分&#xff1a;训练集、验证集与测试集 1. 训练集&#xff08;Training Set&#xff09; 用途&…

【前端】CSS 备忘清单(超级详细!)

文章目录 入门介绍外部样式表 <link>内部样式表 <style>内联样式 style 添加 class 类!important选择器文本颜色背景字体定位动画注释Flex 布局Grid 布局变量和计数器 CSS 选择器示例组选择器链选择器属性选择器第一个子选择器无子选择器 基础组合器属性选择器用户…

Linux操作系统:基于 Linux 的智能家居系统开发与实现 —— 以 FS - MP1A 嵌入式开发板为例

基于 Linux 的智能家居系统开发与实现 —— 以 FS - MP1A 嵌入式开发板为例 摘要 &#xff1a;随着科技的飞速发展&#xff0c;智能家居系统逐渐走进人们的生活&#xff0c;为家庭生活带来便利与安全保障。本文以 FS - MP1A 嵌入式开发板为基础&#xff0c;构建了一个智能化的…