数组与贪心算法——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()里要传什么来改状态 ,了解了自定义比较器

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419454.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux-RPM与YUM

目录 前言&#xff1a; rpm包的管理 rpm包的简单查询指令 ​编辑 rpm包名的基本格式 rpm包名基本格式 ​编辑 卸载rpm包 细节问题 安装rpm包 yum yum的基本指令 安装指定的yum包 yum报错 问题描述&#xff1a; 解决方法&#xff1a; 前言&#xff1a; Linux操…

模型压缩之剪枝

&#xff08;1&#xff09;通道选择 这里要先解释一下&#xff1a; &#xff08;1&#xff09;通道剪枝 那我们实际做法不是上面直接对所有层都添加L1正则项&#xff0c;而是仅仅对BN层权重添加L1正则项。通道剪枝具体步骤如下&#xff1a; 1.BN层权重添加L1正则项&#xf…

还不懂BIO,NIO,AIO吗

BIO&#xff08;Blocking I/O&#xff09;、NIO&#xff08;Non-blocking I/O&#xff09;和 AIO&#xff08;Asynchronous I/O&#xff09;是 Java 中三种不同的 I/O 模型&#xff0c;主要用于处理输入 / 输出操作。 一、BIO&#xff08;Blocking I/O&#xff09; 定义与工作原…

ANSA联合ABAQS基于梁单元的螺栓预紧力分析实例

1、在螺栓孔之间创建一个模拟螺栓 ABAQUS界面→AUXILIARIES→bolt→分鳖选择上下两圈节点,这样在螺栓孔中间就会生成一个梁单元。 中键确定,因为螺杆使用的是变形体,所以接下来需要为其创建一个属性: 单击ok,完成虚拟螺栓的创建,该螺栓两端是刚性MPC,中间是弹性的梁单元…

美畅物联丨科技赋能校车安全:智慧监控管理系统的创新应用

1、背景 1.1应用需求 孩子&#xff0c;作为国家未来的希望之星和民族发展的潜力所在&#xff0c;其安全与健康向来都是社会瞩目的核心要点。校车&#xff0c;作为孩子们日常出行的关键交通载体&#xff0c;其安全性更是时刻牵动着每一个家庭的敏感神经。然而&#xff0c;不可…

利用TCP编程实现FTP功能

模拟FTP核心原理&#xff1a;客户端连接服务器后&#xff0c;向服务器发送一个文件。文件名可以通过参数指定&#xff0c;服务器端接收客户端传来的文件&#xff08;文件名随意&#xff09;&#xff0c;如果文件不存在自动创建文件&#xff0c;如果文件存在&#xff0c;那么清空…

828华为云征文|使用sysbench对Mysql应用加速测评

文章目录 ❀前言❀测试环境准备❀测试工具选择❀测试工具安装❀mysql配置❀未开启Mysql加速测试❀开启Mysql加速测试❀总结 ❀前言 大家好&#xff0c;我是早九晚十二。 昨天有梳理一篇关于华为云最新推出的云服务器产品Flexus云服务器X。当时有说过&#xff0c;这次的华为云F…

【科研小白系列】使用screen创建虚拟终端,实现本地关机后服务器仍然跑模型

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦往期回顾&#xff1a; 【科研小白系列】模型训练已经停止(强行中断)了&#xff0c;可GPU不释放显存&#xff0c;如何解决&#xff1f; 每日一言&#x1f33c;: “生…

k8s网络

pod 网络 在K8S集群里&#xff0c;多个节点上的Pod相互通信&#xff0c;要通过网络插件来完成&#xff0c;比如Calico网络插件。 使用kubeadm初始化K8S集群时&#xff0c;有指定一个参数–pod-network-cidr10.18.0.0/16 它用来定义Pod的网段。 而我们在配置Calico的时候&#…

Trm理论 2(Word2Vec)

神经网络模型&#xff08;NNLM&#xff09;和Word2Vec NNLM模型是上次说过的模型&#xff0c;其目的是为了预测下一个词。 softmax(w2tanh(w1x b1)b2) 会得到一个副产品词向量 而Word2Vue就是专门求词向量的模型 softmax(w2*(w1*x b1)b2) Word2Vec softmax(w2*(w1*x b1)b…

jmeter性能测试HTML测试报告生成详解

作用&#xff1a;jmeter支持生成HTML测试报告&#xff0c;方便查看测试计划中获得图表和统计信息 命令&#xff1a; jmeter -n -t [jmx file] -l [result file] -e -o [html report folder] 示例&#xff1a;jmeter -n -t login.jmx -l result.jtl -e -o ./report jmx文件&a…

Gmsh:一个开源的三维有限元网格生成工具

Gmsh 是一个开源的三维有限元网格生成工具,主要用于在计算流体力学(CFD)和有限元分析(FEA)中生成复杂几何体的网格。它具有强大的几何建模、网格生成、求解器接口和后处理功能。Gmsh 适用于多种物理领域的模拟,包括流体力学、结构分析、电磁学等。 下载地址:https://gm…

【HarmonyOS】- 内存优化

文章目录 知识回顾前言源码分析1. onMemoryLevel2. 使用LRUCache优化ArkTS内存原理介绍3. 使用生命周期管理优化ArkTS内存4. 使用purgeable优化C++内存拓展知识1. Purgeable Memory总结知识回顾 前言 当应用程序占用过多内存时,系统可能会频繁进行内存回收和重新分配,导致应…

Java中Date类型上的注解

在日常开发中&#xff0c;涉及到日期时间类型Date和常用的注解DateTimeFormat和JsonFormat java.util.Date; org.springframework.format.annotation.DateTimeFormat; com.fasterxml.jackson.annotation.JsonFormat; 一 Date类型字段不使用注解 Data AllArgsConstructor N…

开源还是封闭?人工智能的两难选择

这篇文章于 2024 年 7 月 29 日首次出现在 The New Stack 上。人工智能正处于软件行业的完美风暴中&#xff0c;现在马克扎克伯格 &#xff08;Mark Zuckerberg&#xff09; 正在呼吁开源 AI。 关于如何控制 AI 的三个强大观点正在发生碰撞&#xff1a; 1 . 所有 AI 都应该是开…

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页&#xff1a;https://tangyuan96.github.io/minigpt_3d_project_page/ 代码&#xff1a;https://github.com/TangYuan96/MiniGPT-3D 论文&#xff1a;https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA&#xff0c;被ACM MM2024接收&#xff0c;只拥…

【软件设计师真题】下午题第一大题---数据流图设计

解答数据流图的题目关键在于细心。 考试时一定要仔细阅读题目说明和给出的流程图。另外&#xff0c;解题时要懂得将说明和流程图进行对照&#xff0c;将父图和子图进行对照&#xff0c;切忌按照常识来猜测。同时应按照一定顺序考虑问题&#xff0c;以防遗漏&#xff0c;比如可以…

Einsum(Einstein summation convention)

Einsum&#xff08;Einstein summation convention&#xff09; 笔记来源&#xff1a; Permute和Reshape嫌麻烦&#xff1f;einsum来帮忙&#xff01; The Einstein summation convention is a notational shorthand used in tensor calculus, particularly in the fields of …

[数据集][目标检测]西红柿缺陷检测数据集VOC+YOLO格式17318张3类别

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

张飞硬件11~19-电容篇笔记

电容作用 作为源&#xff0c;对后级电路提供能量&#xff0c;对源进行充电。简单讲就是放电和充电。在电路设计中&#xff0c;源往往与负载相隔很远&#xff0c;增加电容就可以起到稳定作用。电容两端的电压不能激变&#xff0c;增加电容可以稳定电压。 电容可以类比为水坝&a…