day31 56. 合并区间763. 划分字母区间435. 无重叠区间

news/2025/2/25 2:46:51/文章来源:https://www.cnblogs.com/lin0304/p/18735273
    1. 合并区间
      问题描述
      给定一个区间的集合,合并所有重叠的区间。
      代码逻辑
      排序:首先按照区间的起始位置对所有区间进行升序排序。
      合并:
      初始化一个当前区间 cur 为第一个区间。
      遍历所有区间,对于每个区间:
      如果当前区间的起始位置小于等于 cur 的结束位置,说明它们重叠,更新 cur 的结束位置为两者结束位置的最大值。
      如果不重叠,则将 cur 添加到结果列表中,并将当前区间设为新的 cur。
      结果:将最终的 cur 添加到结果列表中,并将其转换为数组返回。
      关键点
      排序:按区间起始位置排序是合并区间的前提。
      贪心思想:通过比较当前区间的起始位置和已合并区间的结束位置,决定是否合并。
      时间复杂度
      排序:O(nlogn)
      遍历:O(n)
      总时间复杂度:O(nlogn)
      空间复杂度
      O(n):用于存储结果的列表。
点击查看代码
//56. 合并区间public int[][] merge(int[][] intervals) {Arrays.sort(intervals,new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[0] - o2[0];}});ArrayList<int[]> res = new ArrayList<>();int[] cur = intervals[0];for (int[] interval : intervals) {if (interval[0]<=cur[1]) {cur[1]=Math.max(interval[1],cur[1]);}else {res.add(cur);cur=interval;}}res.add(cur);return res.toArray(new int[res.size()][]);}
    1. 划分字母区间
      问题描述
      给定一个字符串,将字符串划分为若干个子串,使得每个子串内的字符互不相同。
      代码逻辑
      记录字符的最后出现位置:
      使用一个数组 arr,记录每个字符在字符串中最后出现的索引。
      划分区间:
      遍历字符串,对于每个字符:
      找到当前字符及其后续字符的最大右边界。
      如果当前右边界已经是最大右边界,则将当前区间长度加入结果列表,并移动到下一个区间。
      如果有更大的右边界,则更新右边界并重新验证。
      优化版本:
      使用一个变量 start 记录当前区间的起始位置,end 记录当前区间的最大右边界。
      遍历字符串时,更新 end 为当前字符的最后出现位置。
      当遍历到 end 时,说明当前区间结束,将区间长度加入结果列表,并更新 start。
      关键点
      字符的最后出现位置:通过数组快速查询每个字符的最后出现位置。
      贪心思想:每次找到当前区间的最大右边界,确保区间内的字符互不相同。
      时间复杂度
      遍历字符串:O(n)
      查询字符最后出现位置:O(1)
      总时间复杂度:O(n)
      空间复杂度
      O(1):数组 arr 的大小固定为 26,不随输入规模变化。
点击查看代码
//763. 划分字母区间public List<Integer> partitionLabels(String s) {int[] arr = new int[26];for (int i = 0; i < s.length(); i++) {arr[s.charAt(i) - 'a']=i;}List<Integer> res = new ArrayList<>();for (int i = 0; i < s.length();) {int curRight = arr[s.charAt(i) - 'a'];//初始右边界while (true){int maxRight = maxRight(s,arr,i,curRight);//找最大右边界if (curRight==maxRight){//当前边界就是最大右边界res.add(curRight+1-i);i=curRight+1;break;}curRight=maxRight;//有更大的右边界就更新,重新验证该边界是不是最大右边界}}return res;/*效率一样,但这个看起来循环少,更好理解// 记录每个字符最后一次出现的位置int[] lastPositions = new int[26];char[] chars = s.toCharArray();//String拆成char数组for (int i = 0; i < chars.length; i++) {lastPositions[chars[i] - 'a'] = i;}// 初始化当前区间的起始位置和上一个区间的结束位置int start = 0, end = 0;List<Integer> result = new ArrayList<>();for (int i = 0; i < chars.length; i++) {// 更新当前字符最后一次出现的位置int endi = lastPositions[chars[i] - 'a'];if(endi < end) continue;end = endi;// end = Math.max(end, lastPositions[chars[i] - 'a']);// 如果当前字符是区间的结束字符,那么就可以分割出一个子串if (i == end) {result.add(end - start + 1);start = end + 1;}}return result;*/}private int maxRight(String s,int[] arr,int start,int end) {int max = arr[s.charAt(start) - 'a'];for (int i = start+1; i < end; i++) {max = Math.max(max,arr[s.charAt(i) - 'a']);}return max;}
    1. 无重叠区间
      问题描述
      给定一个区间的集合,删除最少数量的区间,使得剩下的区间互不重叠。
      代码逻辑
      排序:按照区间的结束位置对所有区间进行升序排序。
      贪心选择:
      初始化一个变量 end 为第一个区间的结束位置,计数器 count 为 1。
      遍历所有区间,对于每个区间:
      如果当前区间的起始位置大于等于 end,说明它们不重叠,更新 end 为当前区间的结束位置,并增加计数器。
      如果重叠,则跳过当前区间。
      结果:返回需要删除的区间数量,即 intervals.length - count。
      关键点
      排序:按区间结束位置排序是贪心选择的前提。
      贪心思想:优先选择结束位置早的区间,减少后续区间的重叠。
      时间复杂度
      排序:O(nlogn)
      遍历:O(n)
      总时间复杂度:O(nlogn)
      空间复杂度
      O(1):仅使用了常数级别的额外空间。
点击查看代码
//435. 无重叠区间public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {if (o1[1]<o2[1]){return -1;}else if (o1[1]>o2[1]){return 1;}else {return 0;}}});int count = 1;int end = intervals[0][1];for (int i = 1; i < intervals.length; i++) {if (intervals[i][0]<end){continue;}else {end = intervals[i][1];count++;}}return intervals.length-count;}

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

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

相关文章

2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤

在1 使用ollama完成DeepSeek本地部署中使用ollama完成deepSeek的本地部署和运行,此时我可以在PowerShell中通过对话的方式与DeepSeek交流,但此时本地模型不具备联网搜索能力,无法根据网上信息来回答我的问题,同时我也无法将我自己的知识给他参考,这样本地模型相比直接使用…

【毕业设计】【河蟹识别微信小程序】项目总结

一、项目需求与背景 1. 项目背景与需求近年来,相关水产公司以及水产研究所等,利用类似水池生态育种等群体育种方法, 共培育了“长江 1 号”、“长江 2 号”、 “光合 1 号”、“诺亚 1 号”、“江海 21 号”以及“长荡湖 1 号”总计 6 类优良品种。这些新培育的河蟹品种,不仅…

日志(logging)

【一】函数式简单配置 import logging logging.debug(debug message) logging.info(info message) logging.warning(warning message) logging.error(error message) logging.critical(critical message)默认情况下Python的logging模块将日志打印到了标准输出中,且只…

解决Docker连接XQuartz报错

背景 打开XQuartz,在桌面右上角菜单栏中的XQuartz偏好设置中的安全性中启用 "允许从网络客户端连接",并重启XQuartz生效,后续操作中要保持XQuartz为打开状态,不要退出XQuartz报错内容: root@9b90039a4d17:~# ros2 run turtlesim turtlesim_node Authorization r…

MySQL的四种事务隔离级别

一.MySQL四大隔离级别 事务隔离级别 1.读未提交 (Read Uncommitted) 允许一个事务读取另一个事务未提交的数据。 2.读已提交 (Read Committed) 一个事务只能读取另一个事务已经提交的数据。 3.可重复读 (Repeatable Read) 保证在一个事务内多次读取同一数据时,其结果是一致的。…

持续分享干货!清华出品《DeepSeek如何赋能职场》PDF可下载

🔥今天分享的是清华出品《DeepSeek如何赋能职场》的PPT,内容涵盖了DeepSeek运行模式的讲解,如何向DeepSeek提问,如何构建提示词,结合实际多个实际应用场景,详细的介绍了DeepSeek结合其他多模态AI模型持续赋能职场的方法。提示词框架如何使用DeepSeek制作可视化图表如何使…

「跟着渡一学前端」并发请求实现

学习资源 并发请求 【渡一教育】 完整代码 function concurRequest(urls, maxNum) {if (urls.length === 0) {return Promise.resolve([]);}return new Promise((resolve) => {let nextIndex = 0;let finishCount = 0;const result = [];async function _request() {if (nex…

软工作业1

作业相关信息这个作业属于哪个课程 软件工程 这个作业要求在哪里 自我介绍+软工5问 这个作业的目标 自我介绍,了解软件工程基本概念个人介绍 Im YiLaiL YiLaiL/YiLaiL is a ✨ special ✨ repository because its README.md (this file) appears on your GitHub profile.🔭 …

EmEdit设置缓存目录临时文件夹

前言全局说明一、说明 1.1 环境: Windows 11 家庭版 23H2 22631.3737 EmEditor Professional (64-bit) Version 17.2.4二、打开大文本控制器三、点击右边大文本控制器上 自定义四、选择比较大的磁盘空间作为缓存空间免责声明:本号所涉及内容仅供安全研究与教学使用,如出现其他…

谈谈 ES 6.8 到 7.10 的功能变迁(3)- 查询方法篇

上一篇咱们了解了 ES 7.10 相较于 ES 6.8 新增的字段类型,这一篇我们继续了解新增的查询方法。 Interval 间隔查询: 功能介绍 Interval 查询,词项间距查询,可以根据匹配词项的顺序、间距和接近度对文档进行排名。主要解决的查询场景“创建一个多搜索词匹配的查询,同时保留…

【蓝牙小程序】在微信小程序中使用 ECharts

echarts-for-weixin 项目提供了一个小程序组件,用这种方式可以方便地使用 ECharts。 使用方式下载该项目 如有必要,将 ec-canvas 目录下的 echarts.js 替换为最新版的 ECharts。如果希望减小包体积大小,可以使用自定义构建生成并替换 echarts.js pages 目录下是使用的示例文…

Virtual Box设置双网卡

一、硬件 1.为虚拟机添加网卡2.配置网卡二、软件 3.获取mac地址 命令:ip link [root@vbox network-scripts]# ip link 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd…