题目描述

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

解题思路

  • 定义一个比较器,按照区间的起始值排序

  • 使用上述比较器对区间集合进行排序

  • 遍历区间集合,使用一个链表merged保存合并后的结果

    • 如果当前区间和结果链表的尾部没有交集,就直接加入结果链表
    • 如果当前区间和结果链表的尾部交集,就先跟结果链表尾部合并一下
      • 合并方法:结果链表尾部的区间结束值取较大的那一个

Java 实现

private class IntervalComparator implements Comparator<Interval> {
@Override
public int compare (Interval a, Interval b) {
return Integer.compare(a.start, b.start);
}
} public List<Interval> merge (List<Interval> intervals) {
intervals.sort(new IntervalComparator());
LinkedList<Interval> merged = new LinkedList<>();
for (Interval interval : intervals) {
if (merged.isEmpty() || interval.start > merged.getLast().end) {
// 如果没有重叠的部分,就直接加入
merged.add(interval);
} else {
// 如果有重叠的部分,就先合并一下
merged.getLast().end = Math.max(merged.getLast().end, interval.end);
}
}
return merged;
}

心得体会

这一题不是考察经典的排序算法,而是考察排序的应用。另外,定义比较器的代码也需要重视。

最新文章

  1. 函数Curry化
  2. Nexus3.0私服搭建
  3. SOA (面向服务的体系结构)
  4. scp 在Ubuntu下传文件 基于ssh
  5. 在PHPstorm编辑器中配置git环境
  6. Git教程之安装配置(1)
  7. Pyqt5.2.1生成的.ui文件转换成.py
  8. 将Winform程序快速转换为在浏览器中运行的程序
  9. oracle批量导出AWR报告
  10. 学习笔记_Java_day13_JSTL标签库(1、2、3、4、5、6、7、8)
  11. 1003 Crashing Balloon
  12. 无U盘安装Linux openSUSE(通过硬盘安装Linux)
  13. 第三方库FMDB的使用
  14. hdu 5600 BestCoder Round #67 (div.2)
  15. 获取imageView的图和背景图
  16. 关于OSError: [WinError 10038] 在一个非套接字上尝试了一个操作。
  17. Ubuntu 16.04 安装opencv3.4.5/cuda/caffe并使用jni笔记
  18. opensetting禁用后小程序二次授权的问题-以及根据定位城市获取天气
  19. Promise对象的含义和基本用法
  20. (转)Tiny210v2( S5PV210 ) 平台下 FIMD 对应 的 framebuffer 驱动中,关于 video buffer 的理解

热门文章

  1. 使用 OpenSSL为WindowsServer远程桌面(RDP)创建自签名证书 (Self-signed SSL certificate)
  2. cdh5-MariaDB 配置(暂未排版)
  3. xcode自动刷新resource下的文件
  4. JS鼠标吸粉特效
  5. 零拷贝Zero copy-linux and java
  6. Django+Vue前后端分离项目的部署
  7. Nacos(四):SpringCloud项目中接入Nacos作为配置中心
  8. 《深入理解Java虚拟机》- JVM是如何实现反射的
  9. js页面reload问题
  10. js-DOM中基础选择器的整理