数组与贪心算法——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. 最大数(简单) 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 解法一、自定义比较…...

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

2024年全新deepfacelive如何对应使用直播伴侣-腾讯会议等第三方软件
# 2024年全新deepfacelive如何对应使用直播伴侣-腾讯会议等第三方软件 前提按照之前的步骤打开deepfacelive正确配置并且在窗口已经输出了换脸后的视频,不懂步骤可以移步 https://doc.youyacao.com/88/2225 ## 首先下载obs并配置 https://obsproject.com/ 通过…...
告别懵逼——前端项目调试与问题排查方法小结
在日常工作中,我们常常会遇到以下两类典型的挑战: 场景一: 接手无文档的老项目 1、情景描述: 你接手了一个历史久远的项目,项目文档缺失,前任开发者已经离开,而你对当前的业务逻辑和代码结构都…...

[数据集][目标检测]肺炎检测数据集VOC+YOLO格式4983张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4983 标注数量(xml文件个数):4983 标注数量(txt文件个数):4983 标注…...

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

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

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

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

标准库标头 <filesystem> (C++17)学习之文件类型
本篇介绍filesystem文件库的文件类型API。 文件类型 is_block_file (C17) 检查给定的路径是否表示块设备 (函数) is_character_file (C17) 检查给定的路径是否表示字符设备 (函数) is_directory (C17) 检查给定的路径是否表示一个目录 (函数) is_empty (C17) 检查给定的路径是…...

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

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

电脑开机出现no operation system found错误原因分析及解决方法
最近有网友问我电脑一启动提示:no operation system found,这个提示意思是未找到操作系统。并且出现bios能认别硬盘,快捷启动时找不到硬盘,出现该提示的原因有很多,下面我们来详细分析一下开机出现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官方中文文档:https://www.kancloud.cn/liuwave/quill/1434144 扩展表格的使用 注意:想要使用表格 quill的版本要是2.0以后 升级到这个版本后 其他一些插件就注册不了了。 安装: npm install quilllatest 版本需要大于2.0版本 npm…...

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

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

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

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

Elasticsearch数据写入过程
1. 写入请求 当一个写入请求(如 Index、Update 或 Delete 请求)通过REST API发送到Elasticsearch时,通常包含一个文档的内容,以及该文档的索引和ID。 2. 请求路由 协调节点:首先,请求会到达一个协调节点…...

测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

Springboot 高校报修与互助平台小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,高校报修与互助平台小程序被用户普遍使用,为…...
自定义线程池1.2
自定义线程池 1.2 1. 简介 上次我们实现了 1.1 版本,将线程池中的线程数量交给使用者决定,并且将线程的创建延迟到任务提交的时候,在本文中我们将对这个版本进行如下的优化: 在新建线程时交给线程一个任务。让线程在某种情况下…...