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

数组与贪心算法——179、56、57、228(2简2中)

179. 最大数(简单)

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

解法一、自定义比较器

大的排前面然后进行一个比较jpg一开始想的其实是字典序,但是测试里就败了。例如3,30,9,字典序组出来是9033,但9330更大

class Solution {public String largestNumber(int[] nums) {Integer[] boxedArr = Arrays.stream(nums).boxed().toArray(Integer[]::new);Arrays.sort(boxedArr, (o1, o2) -> {String s1 = String.valueOf(o1);String s2 = String.valueOf(o2);String order1 = s1 + s2; // o1o2String order2 = s2 + s1; // o2o1return order2.compareTo(order1);});StringBuilder res = new StringBuilder();for (int num : boxedArr) {res.append(num);}while(res.charAt(0) == '0' && res.length() > 1){res.delete(0,1);}return res.toString();}
}

 
56. 合并区间(中等)

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

解法一、自定义比较器+分类讨论

兄弟你好难

看了官方也能按第一张图那么写,我的写法慢挺多的。搜了一下问题在于用comparingInt的内部类,会涉及Integer操作,所以会涉及一大堆自动装箱

当然做完57才发现,比起判断数组合理了再加入(这里的做法),更合适的做法是取出ans最后一个,和当前待加入的那个数组比较,以current的开头是否在pre的结尾之前为标杆。若在其中,则更改最后一个;若不在其中,则直接加入该数组。无论是代码简洁度还是思路讨论,都会轻松很多。

  Arrays.sort(intervals, new Comparator<int[]>() {public int compare(int[] interval1, int[] interval2) {return interval1[0] - interval2[0];}});作者:力扣官方题解
链接:https://leetcode.cn/problems/merge-intervals/solutions/203562/he-bing-qu-jian-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals, Comparator.comparingInt(o -> o[0]));if(intervals.length == 1)return intervals;List<int[]> list = new LinkedList<>();int start = intervals[0][0],end = intervals[0][1];for(int i = 1;i < intervals.length;i++){if(end < intervals[i][0]){list.add(new int[]{start,end});start = intervals[i][0];end = intervals[i][1];}else if(end < intervals[i][1]){end = intervals[i][1];}}if(list.isEmpty() || start != list.get(list.size()-1)[0]){list.add(new int[]{start,end});}return list.toArray(new int[0][0]);}
}

 

解法一优化

原地数组操作

class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals, new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[0] - o2[0];}});int[] pre = intervals[0];// 原地操作节省空间:已经确定的区间,直接存储在intervals的前面,k记录序号。int k = 0;for (int i = 1; i < intervals.length; i++) {int[] cur  = intervals[i];if(cur[0] <= pre[1]){// 当前区间的左边界小于前一个区间的右边界时,可以合并,用pre记录int e = Math.max(pre[1], cur[1]);pre = new int[]{pre[0], e};}else{// 和前一个不能合并时,将pre记录在intervals的前面,更新pre为curintervals[k++] = pre;pre = cur;}}// 记录最后一个区间intervals[k++] = pre;// 对intervals截断,只取前面的结果部分return Arrays.copyOfRange(intervals,0, k);}
}

 

57. 插入区间(中等)

给你一个 无重叠的 ,按照区间起始端点排序的区间列表 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束,并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。

在 intervals 中插入区间 newInterval,使得 intervals 依然按照 starti 升序排列,且区间之间不重叠(如果有必要的话,可以合并区间)。

返回插入之后的 intervals

注意 你不需要原地修改 intervals。你可以创建一个新数组然后返回它。

解法一、分类讨论 

用gpt写了一些注释。这个讨论也太杂乱了。。。

class Solution {public int[][] insert(int[][] intervals, int[] newInterval) {// 如果原来的 intervals 是空的,直接返回包含 newInterval 的二维数组// 这样避免了后续的复杂逻辑if(intervals.length == 0) return new int[][]{newInterval};// merge 数组保存合并后的区间,初始值为 intervals.length 和 -1// merge[0] 用于存储合并区间的起始值,merge[1] 用于存储合并区间的结束值// merge[1] 初始为 -1 表示还没有需要合并的结束区间int[] merge = new int[]{intervals.length, -1};// wait 标志用于判断是否已经找到了合并区间的起始部分(即 newInterval 和当前区间有重叠)boolean wait = false;// 用 LinkedList 来存储结果,方便后续进行插入操作List<int[]> res = new LinkedList<>();// 遍历 intervals 数组for(int i = 0; i < intervals.length; i++) {if(wait) { // 如果已经找到需要合并的区间的起始部分// 情况1:newInterval 的结束小于当前区间的开始,说明 newInterval 不与当前区间重叠if (newInterval[1] < intervals[i][0] || newInterval[1] <= intervals[i][1]) {merge[1] = Math.max(newInterval[1], intervals[i][1]); // 合并区间的结束为较大值wait = false; // 合并结束res.add(merge); // 添加合并后的区间if(newInterval[1] < intervals[i][0]) { // 如果 newInterval 完全不与当前区间重叠i--; // 回退索引,继续处理当前区间}}  else if(i == intervals.length - 1) {merge[1] = newInterval[1]; // 合并区间的结束为 newInterval 的结束res.add(merge); // 将合并后的区间添加到结果中}} else { // 如果还没找到需要合并的起始部分// 如果 newInterval 的开始小于等于当前区间的结束,且 merge[1] 还没有确定合并结束// 说明 newInterval 和当前区间有重叠,需要开始合并if(newInterval[0] <= intervals[i][1] && merge[1] == -1) {merge[0] = Math.min(newInterval[0], intervals[i][0]); // 合并后的区间起点取两者的较小值wait = true; // 设置 wait,表示正在等待合并结束i--; // 将 i 减回去,以便下一次循环还能处理当前区间} else {// 如果当前区间和 newInterval 无重叠,直接将当前区间添加到结果中res.add(intervals[i]);}}}// 如果在遍历完 intervals 后,merge[1] 仍然为 -1,说明 newInterval 没有与任何区间合并// 直接将 newInterval 添加到结果中if(merge[1] == -1) res.add(newInterval);// 将结果列表转化为二维数组并返回return res.toArray(new int[0][0]);}
}

 

解法二、简化然后合并区间

class Solution {public int[][] insert(int[][] intervals, int[] newInterval) {// 创建一个列表用于保存结果区间List<int[]> ans = new ArrayList<>();// 将新的区间 newInterval 添加到 intervals 数组末尾// 首先需要将二维数组 intervals 转换为 List 以便添加新元素List<int[]> intervalsList = new ArrayList<>(Arrays.asList(intervals));intervalsList.add(newInterval);// 对所有区间按起点进行排序,使用 lambda 表达式对起点进行比较intervalsList.sort((a, b) -> Integer.compare(a[0], b[0]));// 将排序后的第一个区间加入到结果集合 ans 中ans.add(intervalsList.get(0));// 遍历排序后的所有区间for (int i = 1; i < intervalsList.size(); i++) {int[] currentInterval = intervalsList.get(i);int[] lastIntervalInAns = ans.get(ans.size() - 1); // 获取 ans 中最后一个区间// 如果当前区间的起点小于等于 ans 中最后一个区间的终点,说明它们有重叠,需要合并if (currentInterval[0] <= lastIntervalInAns[1]) {// 合并时,更新 ans 中最后一个区间的终点,取两个区间终点中的较大值lastIntervalInAns[1] = Math.max(lastIntervalInAns[1], currentInterval[1]);} else {// 如果没有重叠,直接将当前区间加入到结果集合 ans 中ans.add(currentInterval);}}// 将结果集合转换为二维数组并返回return ans.toArray(new int[ans.size()][]);}
}


228. 汇总区间(简单)

给定一个  无重复元素 的 有序 整数数组 nums 。

返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。

列表中的每个区间范围 [a,b] 应该按如下格式输出:

  • "a->b" ,如果 a != b
  • "a" ,如果 a == b

解法一、遍历

if和while的边界设置比较特殊,通过while一路通向区间最尾端 

class Solution {public static List<String> summaryRanges(int[] nums) {List<String> res = new LinkedList<>();int start,end,len = nums.length;if(len < 2){if(len == 1)res.add(String.valueOf(nums[0]));return res;}for(int i = 0;i < len;i++){start = nums[i];while(i < len - 1 && (nums[i] == nums[i+1] - 1)){i++;}end = nums[i];if(start == end){res.add(String.valueOf(start));}else{StringBuilder sb = new StringBuilder();sb.append(start).append("->").append(end);res.add(sb.toString());}}return res;}
}

 


碎碎念

  • 了解了自动装箱和拆箱,流,序列化

Java的自动装箱和自动拆箱_java自动拆箱和自动装箱-CSDN博客 

Java8中Stream为什么要boxed_stream boxed-CSDN博客

什么是序列化?序列化的作用是什么?Java 中如何实现序列化和反序列化?-CSDN博客

  • 了解了流

Java的自动装箱和自动拆箱_java自动拆箱和自动装箱-CSDN博客

https://blog.csdn.net/weixin_37862824/article/details/112756654

  • 了解了toArray()里要传什么来改状态 ,了解了自定义比较器

 

相关文章:

数组与贪心算法——179、56、57、228(2简2中)

179. 最大数&#xff08;简单&#xff09; 给定一组非负整数 nums&#xff0c;重新排列每个数的顺序&#xff08;每个数不可拆分&#xff09;使之组成一个最大的整数。 注意&#xff1a;输出结果可能非常大&#xff0c;所以你需要返回一个字符串而不是整数。 解法一、自定义比较…...

WireShark过滤器

文章目录 一、WireShark过滤器概念1. 捕获过滤器&#xff08;Capture Filters&#xff09;2. 显示过滤器&#xff08;Display Filters&#xff09;3. 捕获过滤器与显示过滤器的区别4. 过滤器语法结构实际应用场景 二、WireShark捕获数据包列表1. **No.&#xff08;序号&#xf…...

2024年全新deepfacelive如何对应使用直播伴侣-腾讯会议等第三方软件

# 2024年全新deepfacelive如何对应使用直播伴侣-腾讯会议等第三方软件 前提按照之前的步骤打开deepfacelive正确配置并且在窗口已经输出了换脸后的视频&#xff0c;不懂步骤可以移步 https://doc.youyacao.com/88/2225 ## 首先下载obs并配置 https://obsproject.com/ 通过…...

告别懵逼——前端项目调试与问题排查方法小结

在日常工作中&#xff0c;我们常常会遇到以下两类典型的挑战&#xff1a; 场景一&#xff1a; 接手无文档的老项目 1、情景描述&#xff1a; 你接手了一个历史久远的项目&#xff0c;项目文档缺失&#xff0c;前任开发者已经离开&#xff0c;而你对当前的业务逻辑和代码结构都…...

[数据集][目标检测]肺炎检测数据集VOC+YOLO格式4983张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4983 标注数量(xml文件个数)&#xff1a;4983 标注数量(txt文件个数)&#xff1a;4983 标注…...

顶层const和底层const

在C中&#xff0c;const修饰符用于声明常量&#xff0c;有两种常见的形式&#xff1a;顶层const和底层const&#xff0c;它们之间的区别在于它们修饰的对象及其在不同场景中的作用。 1. 顶层const (Top-level const) 顶层const用于修饰变量本身&#xff0c;使其成为常量。这意…...

嵌入式Openharmony系统构建与启动详解

大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建 首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件…...

锡林郭勒奶酪品牌呼和浩特市大召店盛大开业

礼献中秋&#xff0c;香飘乳都。为进一步拓展锡林郭勒奶酪区域公用品牌产品销售渠道&#xff0c;9月8日&#xff0c;锡林郭勒奶酪区域公用品牌大召店在呼和浩特市大召广场月明楼隆重开业&#xff0c;现场为第三批新授权的39家奶酪生产经营主体代表授牌。至此&#xff0c;锡林郭…...

【Java算法】模拟

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【算法工作坊】算法实战揭秘 &#x1f9e3; 一.模拟算法 模拟算法和传统的算法有一些不同之处&#xff0c;更多的是对题目要求的理解&#xff0c;通过代码的方式去模拟实现一道题目在现实中的实现方法…...

标准库标头 <filesystem> (C++17)学习之文件类型

本篇介绍filesystem文件库的文件类型API。 文件类型 is_block_file (C17) 检查给定的路径是否表示块设备 (函数) is_character_file (C17) 检查给定的路径是否表示字符设备 (函数) is_directory (C17) 检查给定的路径是否表示一个目录 (函数) is_empty (C17) 检查给定的路径是…...

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设…...

mysql笔记4(数据类型)

数据库的数据类型应该是数据库架构师(DBA)和产品经理沟通后依据公司的项目、业务而定的&#xff0c;而且会不停地变化。数据类型的选择方面没有一个统一的标准&#xff0c;但是应该符合业务、项目的逻辑标准。 菜鸟教程 Mysql 数据类型 文章目录 1. int类型2. 浮点数3. 定点数4…...

电脑开机出现no operation system found错误原因分析及解决方法

最近有网友问我电脑一启动提示&#xff1a;no operation system found&#xff0c;这个提示意思是未找到操作系统。并且出现bios能认别硬盘&#xff0c;快捷启动时找不到硬盘&#xff0c;出现该提示的原因有很多&#xff0c;下面我们来详细分析一下开机出现no operation system…...

数学建模笔记—— 主成分分析(PCA)

数学建模笔记—— 主成分分析 主成分分析1. 基本原理1.1 主成分分析方法1.2 数据降维1.3 主成分分析原理1.4 主成分分析思想 2. PCA的计算步骤3. 典型例题4. 主成分分析说明5. python代码实现 主成分分析 1. 基本原理 在实际问题研究中,多变量问题是经常会遇到的。变量太多,无…...

@vueup/vue-quill使用quill-better-table报moduleClass is not a constructor

quill官方中文文档&#xff1a;https://www.kancloud.cn/liuwave/quill/1434144 扩展表格的使用 注意&#xff1a;想要使用表格 quill的版本要是2.0以后 升级到这个版本后 其他一些插件就注册不了了。 安装&#xff1a; npm install quilllatest 版本需要大于2.0版本 npm…...

gpp.bat,g++编译C++源文件的批处理

今天编写一个gpp.bat文件&#xff0c;是专门编译C源文件的批处理&#xff0c;内容如下&#xff1a; g %1.cpp -o %1.exegpp.bat的文件路径&#xff1a;D:\YcjWork\CppTour\gpp.bat 使用方法&#xff0c;在CMD下运行(//两个斜杠后面的内容是注释)&#xff1a; //运行gpp.bat&…...

JDBC:连接数据库

文章目录 报错 报错 Exception in thread “main” java.sql.SQLException: Can not issue SELECT via executeUpdate(). 最后这里输出的还是地址&#xff0c;就是要重写toString()方法&#xff0c;但是我现在还不知道怎么写 修改完的代码&#xff0c;但是数据库显示&#…...

【赵渝强老师】大数据主从架构的单点故障

大数据体系架构中的核心组件都是主从架构&#xff0c;即&#xff1a;存在一个主节点和多个从节点&#xff0c;从而组成一个分布式环境。下图为展示了大数据体系中主从架构的相关组件。   视频讲解如下&#xff1a; 大数据主从架构的单点故障 【赵渝强老师】大数据主从架构的…...

【AutoX.js】选择器 UiSelector

文章目录 原文&#xff1a;https://blog.c12th.cn/archives/37.html选择器 UiSelector笔记直接分析层次分析代码分析 最后 原文&#xff1a;https://blog.c12th.cn/archives/37.html 选择器 UiSelector 笔记 AutoX.js UiSelector 直接分析 用于简单、最直接的查找控件 开启悬…...

Elasticsearch数据写入过程

1. 写入请求 当一个写入请求&#xff08;如 Index、Update 或 Delete 请求&#xff09;通过REST API发送到Elasticsearch时&#xff0c;通常包含一个文档的内容&#xff0c;以及该文档的索引和ID。 2. 请求路由 协调节点&#xff1a;首先&#xff0c;请求会到达一个协调节点…...

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操…...

在C++中,如何避免出现Bug?

C中的主要问题之一是存在大量行为未定义或对程序员来说意外的构造。我们在使用静态分析器检查各种项目时经常会遇到这些问题。但正如我们所知&#xff0c;最佳做法是在编译阶段尽早检测错误。让我们来看看现代C中的一些技术&#xff0c;这些技术不仅帮助编写简单明了的代码&…...

Linux 操作系统 进程(1)

什么是进程 想要了解什么是进程&#xff0c;或者说&#xff0c;为什么会有进程这个概念&#xff0c;我们就需要去了解现代计算机的设计框架(冯诺依曼体系)&#xff1a; 计算机从设计之初就以执行程序为核心任务&#xff0c;也就是运算器从内存中读取&#xff0c;也只从内存中…...

clickhouse-v24.1-离线部署

部署版本 数据库版本&#xff1a;24.1.1.2048 jdk版本&#xff1a;jdk8 4个文件&#xff08;三个ck的包&#xff09;&#xff1a; OpenJDK8U-jdk_x64_linux_hotspot_8u382b05.tar clickhouse-client-24.1.1.2048.x86_64.rpm clickhouse-common-static-24.1.1.2048.x86_64.…...

安卓13删除app 链接库警告弹窗Detected problems with app native

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码修改彩蛋1.前言 有些客户的APP,打开首次会弹窗提示窗口, Detected problems with app native libraries (please consult log for detail):,需要删除这个窗口,避免挡住用户APP。而且这个提示有些app是以t…...

第四次北漂----挣个独立游戏的素材钱

第四次北漂&#xff0c;在智联招聘上&#xff0c;有个小公司主动和我联系。面试了下&#xff0c;决定入职了&#xff0c;osg/osgearth的。月薪两万一。 大跌眼镜的是&#xff0c;我入职后&#xff0c;第一天的工作内容就是接手他的工作&#xff0c;三天后他就离职了。 我之所以…...

漫谈设计模式 [12]:模板方法模式

引导性开场 菜鸟&#xff1a;老大&#xff0c;我最近在做一个项目&#xff0c;遇到了点麻烦。我们有很多相似的操作流程&#xff0c;但每个流程的细节又有些不同。我写了很多重复的代码&#xff0c;感觉很乱。你有啥好办法吗&#xff1f; 老鸟&#xff1a;嗯&#xff0c;听起…...

CSS学习10[重点]--浮动、浮动的效果以及内幕特性

CSS布局——浮动 前言一、普通流二、浮动三、什么是浮动?四、浮动的内幕特性总结 前言 CSS盒子布具的三种机制&#xff1a;普通流&#xff08;标准流&#xff09;、定位、浮动。 一、普通流 普通流&#xff1a;网页内元素自上而下&#xff0c;从左到右排序。 二、浮动 浮动…...

matlab基本语法

基本语法 变量命名规则 区分大小写长度不超过63位字母开头&#xff0c;可以有字母、下划线和数字组成&#xff0c;但不能使用标点应该简洁明了 命令行窗口 >>>clc 清楚命令窗口 >>> claer all 清理工作区内容 注释 %% 注释符 数据类型 1.数字 11 2…...

【Leetcode152】乘积最大子数组(动态规划)

文章目录 一、题目二、思路三、代码 一、题目 二、思路 &#xff08;0&#xff09;读懂题意&#xff1a;题目的“连续”是指位置的连续&#xff0c;而不是说数字的连续&#xff0c;这是个大坑。 &#xff08;1&#xff09;确定状态&#xff1a;定义两个状态来记录当前子数组的…...