Merge Intervals

原题链接Merge Intervals

合并所有有重叠的间隔

对于两个间隔interval1interval2,二者有重叠的情况为

  • interva1全部包含interval2,也就是说interval1.start <= interval2.start && interval1.end >= interval2.end。例如[2, 3][1, 5]
  • interval2全部包含interval1,同上。例如[1, 5][2, 3]
  • interval1interval2有交集,且interval1.start <= interval2.start。例如[1, 3][2, 4]
  • interval1interval2有交集,且interval1.start >= interval2.start。例如[2, 4][1, 3]

所以,为了减少情况,首先应该确保interval1一定在interval2左边,也就是确保interval1.start <= interval2.start。那么就需要将原间隔集合根据间隔的开始位置排序

但是此时仍然有三种情况需要讨论,但是,可以反过来考虑,即二者没有重叠的情况为

  • 前一个间隔的结束位置小于后一个间隔的开始位置,即interval1.end < interval2.start

所以,可以先判断二者是不是没有重叠,否则,就一定有重叠,不需要考虑三种有重叠的情况。
那么,如果有重叠时,就需要记录合并之后的开始位置和结束位置

  • 开始位置为两个间隔开始位置的较小者
  • 结束位置为两个间隔结束位置的较大者

代码如下

/*** Definition for an interval.* struct Interval {*     int start;*     int end;*     Interval() : start(0), end(0) {}*     Interval(int s, int e) : start(s), end(e) {}* };*/
class Solution {
public:vector<Interval> merge(vector<Interval>& intervals) {vector<Interval> res;if(intervals.empty())return res;std::sort(intervals.begin(), intervals.end(), ComInterval);/* [start, end]为上一个没有添加到结果集中的间隔 */int start = intervals[0].start;int end = intervals[0].end;for(int i = 1; i < intervals.size(); ++i){/* 如果上一个间隔和当前间隔没有重叠,就将上一个间隔添加到结果集中 */if(end < intervals[i].start){res.emplace_back(Interval(start, end));start = intervals[i].start;end = intervals[i].end;}else{/* 有重叠,合并两个间隔 */start = std::min(intervals[i].start, start);end = std::max(intervals[i].end, end);}}res.emplace_back(Interval(start, end));return res;}
private:static bool ComInterval(const Interval& lhs, const Interval& rhs){return lhs.start < rhs.start;}
};

Insert Interval

原题链接Insert Interval

给定一个按照开始位置递增排序且无重叠的间隔集合,插入给定的间隔,并合并有重叠的间隔

有三种情况

  • 在待插入间隔前面的且和它无重叠的间隔,只需要放到结果集中
  • 与待插入间隔有重叠的间隔和待插入间隔合并成一个间隔,放到结果集中
  • 在待插入间隔后面的且和它无重叠的间隔,只需要放到结果集中

第一步只需要判断没有重叠即可
第三步只需要找到第一个和待插入间隔无重叠的间隔即可

代码如下

/*** Definition for an interval.* struct Interval {*     int start;*     int end;*     Interval() : start(0), end(0) {}*     Interval(int s, int e) : start(s), end(e) {}* };*/
class Solution {
public:vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {vector<Interval> res;int i = 0;for(; i < intervals.size(); ++i){/* 在待插入间隔前面的间隔,如果没有重叠就直接添加到结果集中 */if(newInterval.start > intervals[i].end){res.emplace_back(intervals[i]);}/* 找到了后面第一个和待插入间隔无重叠的间隔,跳出,直接将后面的间隔添加到结果集中 */else if(newInterval.end < intervals[i].start){break;}/* 有重叠,合并成一个,改变待插入间隔的起止位置 */else{newInterval.start = std::min(newInterval.start, intervals[i].start);newInterval.end = std::max(newInterval.end, intervals[i].end);}}/* 插入待插入间隔,将后面的间隔依次添加 */res.emplace_back(newInterval);while(i < intervals.size())res.emplace_back(intervals[i++]);return res;}
};

这两道题主要就是如果判断两个间隔有重叠部分,方法是先判断没有重叠,否则就一定有重叠。剩下的就是不断的插入到结果中

每天一道LeetCode-----将间隔集中有重叠的间隔合并相关推荐

  1. 一天一道LeetCode(61-90)

    一天一道LeetCode(61-90) 文章目录 一天一道LeetCode(61-90) 61.旋转链表 62.不同路径 63.不同路径 II 64.最小路径和 65.有效数字(未解决) 66.加一 ...

  2. leetcode17. 电话号码的字母组合--每天刷一道leetcode算法系列!

    作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...

  3. leetcode最小面积_每日一道 LeetCode (51):盛最多水的容器

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  4. atoi函数_每日一道 LeetCode (50):字符串转换整数 (atoi)

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  5. 去掉数组最后一个元素_leetcode 34. 在排序数组中查找元素的第一个和最后一个位置每天刷一道leetcode算法系列!...

    作者:reed,一个热爱技术的斜杠青年,程序员面试联合创始人 前文回顾: leetcode1. 两数之和--每天刷一道leetcode系列! leetcode2. 两数相加--每天刷一道leetcod ...

  6. 二叉树层次遍历c语言_每日一道 LeetCode (23):二叉树的层次遍历 II

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  7. c++两个数组对比去掉重复的元素_每日一道 LeetCode (8):删除排序数组中的重复项和移除元素...

    ❝ 每天 3 分钟,走上算法的逆袭之路. ❞ 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub:https://github.com/meteor1993/LeetCode Gi ...

  8. 【python】一道LeetCode搞懂递归算法!#131分割回文串 #以及刷LeetCode的一点点小心得 [数据结构与算法基础]

    题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串.返回 s 所有可能的分割方案. # 示例 输入: "aab" 输出: [["aa",&q ...

  9. 每日一道 LeetCode (16):求 x 的平方根

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

最新文章

  1. 布尔(bool)值需注意事项
  2. ActiveReports 报表应用教程 (1)-Hello ActiveReports
  3. 调试linux内核前的多虚拟机网络配置(图文教程)
  4. dropdownlist三级联动怎么实现_Excel下拉菜单不会做?15秒教会你制作一二三级联动下拉菜单,从此做表不求人!...
  5. 增量调制原理matlab仿真,增量调制(DM  △M)
  6. php 缺少 wordpress,Wordpress localhost安装错误 - 您的PHP安装似乎缺少WordPress所需的MySQL扩展程序...
  7. 程序媛如何自我突破?
  8. 云小课|CDN第5课 CDN入门之—我的网站可以用CDN加速吗?
  9. Python socket编程模拟最简单的HTTP响应
  10. dev 命令行参数调用_在Linux系统上使用简单命令行创建高强度的预共享密钥
  11. TypeScript:运算符
  12. 线性代数知识点总结,基础概念和计算整理(手写版)
  13. SSH连接GitHub并配置ssh key
  14. 反爬虫破解——百度翻译
  15. android批量发送短信
  16. 家庭组网:Vlan单线复用,故障检测以及五种“软路由”加mesh组网方案
  17. openGauss 简介
  18. 【元胞自动机】基于元胞自动机的人口疏散仿真matlab代码
  19. SAP UI5 图片显示控件 Avatar 的使用方式介绍试读版
  20. java阶乘和的算法_关于JAVA阶乘的算法的解释?

热门文章

  1. Java黑皮书课后题第10章:*10.19(Mersenne素数)
  2. 九度OJ最短摘要的生成
  3. Fencing the Cows [USACO]
  4. 聚类算法(五)--层次聚类(系统聚类)及超易懂实例分析
  5. CentOS7 设置主机名及IP映射
  6. wireshark抓包分析tcp连接与断开
  7. PlistBuddy简单使用
  8. WPF 自定义快捷键命令(COMMAND)(转)
  9. linux下Intellij Idea 14的安装
  10. 让那些为Webkit优化的网站也能适配IE10(转载)