56. Merge Intervals(合并区间)解法(C++ & 注释)

1. 题目描述

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

示例 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] 可被视为重叠区间。

题目链接:中文题目英文题目

2. 排序(Sorting)

2.1 解题思路

首先,这题需要明确一下输入的限制,否则会有很多歧义,题意也没有明说:

1 <= intervals[i].length <= 2,且intervals[i][0] <= intervals[i][1]

其实用sort排序之后,思路非常好理解的。我们以下面这个例子为例:

[[1,3],[2,6],[8,10],[15,18]]

升序排序之后,我们确保相邻两个间距最近,如果它们不能合并,则第一个间距则不可能和后面的间距合并。比如上面这个例子,[1,3]右边界3大于[2,6]左边界2,它们可以合并,之后[2,6]的右边界6小于[8,10]左边界8,所以不能合并,因为是升序排序,所以[2,6]也不能和比[8,10]远的[15,18]合并。所以我们利用这点,总结出下面的合并规律:

前一个间隔右边界小于等于后一个间隔左边界,则可以合并;反之,则不能合并,将这个间隔加入答案中,移动到下一个间隔,继续合并后面的间隔;

2.2 实例代码

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> ans;
        if (!intervals.size()) return ans;
        sort(intervals.begin(), intervals.end());

        int start = intervals[0][0], end = intervals[0][1];
        for (vector<int>& interval : intervals) {
            if (end >= interval[0]) end = max(end, interval[1]);
            else { ans.push_back({ start, end }); start = interval[0]; end = interval[1]; }
        }
        ans.push_back({ start, end });

        return ans;
    }
};  

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值