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

力扣热题100:合并区间详解(Java实现)(56)

题目描述

解题思路

核心思想:排序 + 贪心合并
  1. 排序预处理 先按区间左端点升序排序,使重叠的区间相邻。这是合并操作的基础,确保只需一次遍历即可完成合并。

    • 排序后,重叠区间必然连续分布(如 [1,3] 和 [2,6] 相邻)。
  2. 贪心合并 遍历排序后的区间列表,动态维护当前合并区间的右边界:

    • 若当前区间左端点 ≤ 上一区间的右端点 → 合并(更新右边界为两者最大值);
    • 否则 → 将上一区间加入结果,开启新区间
    •  贪心策略:每次合并时取最大右边界,确保覆盖最广 

代码详解(逐行分析)

class Solution {public int[][] merge(int[][] intervals) {// Step 1: 按左端点升序排序Arrays.sort(intervals, new Comparator<int[]>() {public int compare(int[] o1, int[] o2) {return o1[0] - o2[0]; // 比较左端点}});// Step 2: 动态合并重叠区间List<int[]> result = new ArrayList<>();for (int i = 0; i < intervals.length; i++) {int left = intervals[i][0];int right = intervals[i][1];// 情况1:结果集为空 或 当前区间与上一区间不重叠 → 直接添加if (result.size() == 0 || result.get(result.size() - 1)[1] < left) {result.add(new int[]{left, right});} // 情况2:当前区间与上一区间重叠 → 合并(更新右边界)else {result.get(result.size()-1)[1]=Math.max(right, result.get(result.size()-1)[1]);}}// Step 3: 转换List为二维数组return result.toArray(new int[result.size()][]);}
}

关键逻辑解析
  1. 排序函数 Arrays.sort 中使用自定义比较器,确保按区间左端点(o1)升序排列 。
  2. 合并条件
    • result.size() == 0:结果集为空时,直接添加第一个区间;
    • last [1](@ref) < left:当前区间左端点大于上一区间的右端点 → 无重叠;
    • 否则更新上一区间的右边界为 max(last [1](@ref), right) 。
  3. 结果转换 result.toArray() 将 ArrayList 转为二维数组,满足返回值类型要求。

复杂度分析

  • 时间复杂度:O(nlog⁡n)O(nlogn) 排序占主导(O(nlog⁡n)O(nlogn)),遍历仅需 O(n)O(n) 。
  • 空间复杂度:O(n)O(n) 存储结果需额外空间(最坏情况下无重叠,需存所有区间) 。

总结与拓展

  1. 为什么贪心策略有效? 排序后,局部最优(每次合并取最大右边界)可推导出全局最优解 。
  2. 边界处理技巧
    • 输入空数组时,result.size()==0 确保安全 ;
    • 区间端点相等(如 [1,4] 和 [4,5])视为重叠 。
http://www.xdnf.cn/news/19280.html

相关文章:

  • 在SAP系统中,如何查询已经被打上了删除标记的生产订单?
  • 数据结构(04)—— 栈和队列
  • [每周一更]-(第158期):构建高性能数据库:MySQL 与 PostgreSQL 系统化问题管理与优化指南
  • 【lua】元表、元方法 详解及应用
  • 【LeetCode_27】移除元素
  • Ubuntu中通过SSH克隆Windows的远程Git仓库(局域网中挺有用)
  • 对于牛客网—语言学习篇—编程初学者入门训练—复合类型:二维数组较简单题目的解析
  • Unity核心概念①
  • 准备机试--图【y总版】[重要]【最短路】
  • 三重积分的对称性
  • shell编程-核心变量知识
  • 面试专栏
  • Agent实战教程:LangGraph结构化输出详解,让智能体返回格式化数据
  • 第N个丑数
  • 文件夹和文件一键加密,保护你的隐私
  • CRM、ERP、HRP系统有啥区别?
  • 本地运行 Ollama 与 DeepSeek R1 1.5B,并结合 Open WebUI 测试
  • 安卓编程 之 线性布局
  • 数组去重【JavaScript】
  • 基于 MyBatis-Plus 拦截器实现锁定特殊数据(二)
  • kmp 算法
  • 42-Ansible-Inventory
  • 模式组合应用-组合模式
  • SpringAI应用开发面试剧本与技术知识全解析:RAG、向量数据库、多租户与企业落地场景
  • DbVisualizer:一款功能强大的通用数据库管理开发工具
  • 1.8 Memory
  • Python 入门 Swin Transformer-T:原理、作用与代码实践
  • 05MySQL多表查询全解析
  • 使用axios封装post和get
  • RLPD——利用离线数据实现高效的在线RL:不进行离线RL预训练,直接应用离策略方法SAC,在线学习时对称采样离线数据