56. Merge Intervals

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

思路

本题要合并重叠的区间,对于区间[start1, end1]和[start2, end2],如果start1 <= start2,则当end1 >= start2时区间重叠,可以合并为[start1, max(end1,end2)];否则,两个区间不重叠。

因此问题的难点在于选择依据区间的起始端点对区间进行排序,在本题中,区间和输入参数分别为:

struct Interval {
      int start;
      int end;
      Interval() : start(0), end(0) {}
      Interval(int s, int e) : start(s), end(e) {}
  };

vector<Interval> merge(vector<Interval>& intervals) {}

输入的区间集合的存储方式是vector<Interval>,如何对该vector进行排序呢?

考虑使用STL的排序算法sort,但是要定制仿函数,作为第三个参数传入sort()中。

class Solution {
public:
    
    vector<Interval> merge(vector<Interval>& intervals) {
        int n = intervals.size();
        if (n <= 1)
            return intervals;
        
        sort(intervals.begin(), intervals.end(), 
            [](const Interval& lhs, const Interval& rhs) -> bool {return lhs.start < rhs.start;});
        
        int i = 0;
        int j = 1;
        while (j < n) {
            if (intervals[i].end >= intervals[j].start) {
                intervals[i].end = std::max(intervals[i].end, intervals[j].end);
                ++j;
            }
            else {
                ++i;
                intervals[i].start = intervals[j].start;
                intervals[i].end = intervals[j].end;
                ++j;
            }
        }
        intervals.erase(intervals.begin() + i + 1, intervals.end());
        
        return intervals;
    }
};

LeetCode汇总

posted @ 2017-06-07 17:14  NaiveCoder  阅读(122)  评论(0)    收藏  举报