LeetCode 56 合并区间

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jsszwc/article/details/87868564

题目:

https://leetcode-cn.com/problems/merge-intervals/submissions/

题意:

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

思路:

首先对区间排序,首先按左端点升序排序,如果左端点相等,那么按右端点升序排序,然后线性扫描一遍:

  • 对于扫描到的当前区间,如果其左端点在已知区间的右端点左侧,那么就可以合并区间,并且取两个区间右端点的最大值做为新区间的右端点;
  • 否则无法合并,把已知区间加入答案合集中,把扫描的当前区间作为新的已知区间,继续扫描

代码:

/**
 * 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) {
        sort(intervals.begin(), intervals.end(), [](const Interval& a, const Interval& b) {
            return a.start != b.start ? a.start < b.start : a.end < b.end;
        });

        vector<Interval> ans;
        Interval temp;
        for(int i = 0; i < intervals.size(); i++) {
            if(i == 0) {
                temp = intervals[i];
            } else {
                if(intervals[i].start <= temp.end) {
                    temp.end = max(temp.end, intervals[i].end);
                } else {
                    ans.emplace_back(temp);
                    temp = intervals[i];
                }
            }
        }
        //把最后一个区间加入到答案中
        if(!intervals.empty()) {
            ans.emplace_back(temp);
        }

        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/jsszwc/article/details/87868564