• 56.合并区间 | 1288.删除被覆盖的区间 | 986.区间列表的交集


    56.合并区间

    以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

    示例 1:

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

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

    思路:
    一文秒杀所有区间相关问题

    区间问题先排序,所有区间按起点升序排,起点相同的按终点降序排

     排好之后的区间有三种情况:1.覆盖    2.相交   3.完全不相交

    2.相交 

    1. class Solution {
    2. public:
    3. static bool cmp(vector<int>& a,vector<int>& b)
    4. {
    5. if(a[0]==b[0])
    6. return a[1]>b[1];
    7. else
    8. return a[0]0];
    9. }
    10. vectorint>> merge(vectorint>>& intervals) {
    11. //所有区间按起点升序排,起点相同的按终点降序排
    12. sort(intervals.begin(),intervals.end(),cmp);
    13. int left=intervals[0][0];
    14. int right=intervals[0][1];
    15. vectorint>> res;
    16. for(int i=1;isize();i++)
    17. {
    18. //两区间相交,合并成一个大区间
    19. if(intervals[i][0]<=right&&intervals[i][1]>=right)
    20. {
    21. right=intervals[i][1];
    22. }
    23. //两区间完全不相交,将之前的{left,right}加入结果中,更新left和right
    24. if(intervals[i][0]>right&&intervals[i][1]>right)
    25. {
    26. res.push_back({left,right});
    27. left=intervals[i][0];
    28. right=intervals[i][1];
    29. }
    30. }
    31. //把最后一组{left,right}加入结果中
    32. res.push_back({left,right});
    33. return res;
    34. }
    35. };

    1288.删除被覆盖的区间

    给你一个区间列表,请你删除列表中被其他区间所覆盖的区间。

    只有当 c <= a 且 b <= d 时,我们才认为区间 [a,b) 被区间 [c,d) 覆盖。

    在完成所有删除操作后,请你返回列表中剩余区间的数目。

    示例:

    输入:intervals = [[1,4],[3,6],[2,8]]
    输出:2
    解释:区间 [3,6] 被区间 [2,8] 覆盖,所以它被删除了。 

    1.覆盖 

    1. class Solution {
    2. public:
    3. static bool cmp(vector<int>& a,vector<int>& b)
    4. {
    5. if(a[0]==b[0])
    6. return a[1]>b[1];
    7. else
    8. return a[0]0];
    9. }
    10. int removeCoveredIntervals(vectorint>>& intervals) {
    11. sort(intervals.begin(),intervals.end(),cmp);//排序
    12. int left=intervals[0][0];
    13. int right=intervals[0][1];
    14. int del=0;
    15. for(int i=1;isize();i++)
    16. {
    17. //覆盖,要删除的区间数加一
    18. if(intervals[i][0]>=left&&intervals[i][1]<=right)
    19. {
    20. del++;
    21. }
    22. //除覆盖以外的其他情况,更新{left,right}
    23. else
    24. {
    25. left=intervals[i][0];
    26. right=intervals[i][1];
    27. }
    28. }
    29. return intervals.size()-del;//剩余区间数=总数-要删除区间数
    30. }
    31. };

    986.区间列表的交集 

    给定两个由一些 闭区间 组成的列表,firstList 和 secondList ,其中 firstList[i] = [starti, endi] 而 secondList[j] = [startj, endj] 。每个区间列表都是成对 不相交 的,并且 已经排序 。

    返回这 两个区间列表的交集 。

    形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合,而 a <= x <= b 。

    两个闭区间的 交集 是一组实数,要么为空集,要么为闭区间。例如,[1, 3] 和 [2, 4] 的交集为 [2, 3] 。

    示例 1:


    输入:firstList = [[0,2],[5,10],[13,23],[24,25]], secondList = [[1,5],[8,12],[15,24],[25,26]]
    输出:[[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]

    1. class Solution {
    2. public:
    3. vectorint>> intervalIntersection(vectorint>>& firstList, vectorint>>& secondList) {
    4. vectorint>> res;
    5. int i=0;
    6. int j=0;
    7. while(isize()&&jsize())
    8. {
    9. int a1=firstList[i][0];
    10. int a2=firstList[i][1];
    11. int b1=secondList[j][0];
    12. int b2=secondList[j][1];
    13. if(b1<=a2&&b2>=a1)//相交或覆盖时,取交集(左边界取大的那个,右边界取小的那个)
    14. {
    15. int left=max(a1,b1);
    16. int right=min(a2,b2);
    17. res.push_back({left,right});
    18. }
    19. if(b2<=a2)//secondList[j]在firstList[i]的左边,所以j++
    20. j++;
    21. else//...在...的右边,所以i++
    22. i++;
    23. }
    24. return res;
    25. }
    26. };
  • 相关阅读:
    Disco Diffusion 快速入门
    Springboot毕设项目基于Springboot的手机电商网站lmo47(java+VUE+Mybatis+Maven+Mysql)
    java毕业设计基于BS架构的视频监控系统的设计与实现mybatis+源码+调试部署+系统+数据库+lw
    ChatGPT 的 Text Completion
    vue中常见的3块标签的介绍
    Python武器库开发-flask篇之session与cookie(二十六)
    linux系统环境离线安装
    python+matplotlib绘制具有多个子图的图表
    MySQL学习笔记16
    android mk常用代码
  • 原文地址:https://blog.csdn.net/weixin_50437588/article/details/126593997