【贪心算法4】

server/2025/3/17 14:09:51/

力扣452.用最少数量的剪引爆气球

链接: link

思路

这道题的第一想法就是如果气球重叠得越多那么用箭越少,所以先将气球按照开始坐标从小到大排序,遇到有重叠的气球,在重叠区域右边界最小值之前的区域一定需要一支箭,这道题有两个地方容易出错:
1.出现重叠区域,忘记更新最右边气球的有边界;
2.在重叠区域内射箭,即在下面提供的代码中else里执行res++;
这是我自己容易犯的错

class Solution {public int findMinArrowShots(int[][] points) {if (points.length == 0)return 0;Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));int res = 1;// 气球数组不为0,至少需要一支箭for (int i = 1; i < points.length; i++) {// 当前气球开始位>前一个气球的结束位置if (points[i][0] > points[i - 1][1]) {res++;} else {// 否则当前气球和前一个气球挨着// 更新当前气球的有边界,瑜前一个气球比较// 更新是为了避免和后一个气球比较的时候重复射箭points[i][1] = Math.min(points[i][1], points[i - 1][1]);}}return res;}
}

435.无重叠区间
链接: link

class Solution {public int eraseOverlapIntervals(int[][] intervals) {if (intervals.length == 1)return 0;// 按照右边界排序,从前向后遍历Arrays.sort(intervals, (a, b) -> Integer.compare(a[1], b[1]));int cnt = 1;// 统计重合区域for (int i = 1; i < intervals.length; i++) {// 当前节点的左边界<前一个节点的右边界,一定有重合if (intervals[i][0] < intervals[i - 1][1]) {// 更新当前节点右边界intervals[i][1] = Math.min(intervals[i][1], intervals[i - 1][1]);} else {// 当前节点和前一个节点没有重合cnt++;}}return intervals.length - cnt;}
}

相似题型

763.划分字母区间
链接: link

class Solution {public List<Integer> partitionLabels(String s) {List<Integer> ls = new ArrayList<>();int[] edge = new int[26];char[] chars = s.toCharArray();for (int i = 0; i < chars.length; i++) {edge[chars[i] - 'a'] = i; // 记录每个字母最大边界}int left = 0, right = 0;for (int i = 0; i < chars.length; i++) {right = Math.max(right, edge[chars[i] - 'a']);if (i == right) {ls.add(i - left + 1);left = right + 1;}}return ls;}
}

56.合并区间
链接: link

思路

这种题本质和【算法>贪心算法4】的452和435一样的套路,这几道题都是判断区间重叠,区别就是判断区间重叠后的逻辑,本题是判断区间重贴后要进行区间合并。所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。
唯一需要考虑的是什么时候更新区间以及添加到ls中。

class Solution {public int[][] merge(int[][] intervals) {List<int[]> ls = new ArrayList<>();if(intervals.length == 1) return intervals;Arrays.sort(intervals,(a,b)->Integer.compare(a[0], b[0])); // 按照左边界排序int start = intervals[0][0],end = intervals[0][1];for(int i = 1;i<intervals.length;i++){// 无重叠if(intervals[i][0] > end){// 合并ls.add(new int[]{start,end});// 更新start = intervals[i][0];end = intervals[i][1];}else{end = Math.max(end,intervals[i][1]);}}ls.add(new int[]{start,end});return ls.toArray(new int[ls.size()][]);}
}

http://www.ppmy.cn/server/175713.html

相关文章

基础输入输出技术深度解析与实践指南

1.理解文件 1-1 狭义理解 • ⽂件在磁盘⾥。 • 磁盘是永久性存储介质&#xff0c;因此⽂件在磁盘上的存储是永久性的。 • 磁盘是外设&#xff08;即是输出设备也是输⼊设备&#xff09;。 • 磁盘上的⽂件 本质是对⽂件的所有操作&#xff0c;都是对外设的输⼊和输出 简称 I…

【Java代码审计 | 第十四篇】MVC模型、项目结构、依赖管理及配置文件概念详解

未经许可&#xff0c;不得转载。 文章目录 MVC模型模型&#xff08;Model&#xff09;视图&#xff08;View&#xff09;控制器&#xff08;controller&#xff09;MVC工作流程 项目结构java目录resources目录webapp目录 依赖管理配置文件 MVC模型 MVC&#xff08;Model-View-…

【C语言】函数和数组实践与应用:开发简单的扫雷游戏

【C语言】函数和数组实践与应用&#xff1a;开发简单的扫雷游戏 1.扫雷游戏分析和设计1.1扫雷游戏的功能说明&#xff08;游戏规则&#xff09;1.2游戏的分析与设计1.2.1游戏的分析1.2.2 文件结构设计 2. 代码实现2.1 game.h文件2.2 game.c文件2.3 test.c文件 3. 游戏运行效果4…

Blender-MCP服务源码5-BlenderSocket插件安装

Blender-MCP服务源码5-BlenderSocket插件安装 上一篇讲述了Blender是基于Socket进行本地和远程进行通讯&#xff0c;现在尝试将BlenderSocket插件安装到Blender中进行功能调试 1-核心知识点 将开发的BlenderSocket插件安装到Blender中 2-思路整理 1&#xff09;将SocketServe…

自探索大语言模型微调(一)

一、数据 1.1、失败案例 Hugging Face&#xff1a; 根据B站上搜索到的资料&#xff0c;datasets这个库可以直接下载丰富的数据集合和与训练模型&#xff0c;调用也非常的简单&#xff0c;唯一的缺点就是&#xff0c;需要外网&#xff08;翻墙&#xff09;&#xff0c;用国内的…

Excel单元格中插入自定义超链接

Excel单元格中插入自定义超链接 方法一、插入静态自定义超链接 适用场景: 手动设置固定显示文本和链接地址 快捷键 Ctrl K 可显示插入超链接窗口. 方法二、适用HYPERLINK函数动态生成超链接 跳转到超链接 HYPERLINK("https://www.bilibili.com/?","CS…

招聘信息|基于SprinBoot+vue的招聘信息管理系统(源码+数据库+文档)

招聘信息管理系统 目录 基于SprinBootvue的招聘信息管理系统 一、前言 二、系统设计 三、系统功能设计 5.1系统功能模块 5.2管理员功能模块 5.3企业后台管理模块 5.4用户后台管理模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…

初阶数据结构(C语言实现)——5.3 堆的应用(1)——堆排序

目录 1 堆的应用1.1 堆排序1.1.1 思路1.1.2 代码实现 1.2 建堆的时间复杂度1.2.1 向下调整1.2.1 向上调整1.2.3 结论 学习堆的应用之前&#xff0c;欢迎学习下堆。 这是博主之前的文章&#xff0c;欢迎学习交流 初阶数据结构&#xff08;C语言实现&#xff09;——5.2 二叉树的…