【LeetCode】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].

解题思路

先对区间根据第一个元素进行排序。
然后每次判断下一个区间是否和当前区间有交集,若有,则扩展区间。否则,说明当前区间终止,结束当前区间并开始一个新的区间。
注意,此题使用的是闭区间

AC代码

/**
 * 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:
    static bool compareFn(const Interval& i1, const Interval& i2) {
        return (i1.start < i2.start || (i1.start == i2.start && i1.end < i2.end));
    }

    vector<Interval> merge(vector<Interval>& intervals) {
        vector<Interval> ans;
        if (intervals.empty())
            return ans;

        sort(intervals.begin(), intervals.end(), compareFn);
        for (int idx = 0; idx < intervals.size(); ++idx) {
            int start = intervals[idx].start;
            int end = intervals[idx].end;
            int nextIdx = idx + 1;
            for (; nextIdx < intervals.size(); ++nextIdx) {
                //overlap, expand
                if (intervals[nextIdx].start <= end) {
                    end = max(end, intervals[nextIdx].end);
                }
                //no overlap, push back current interval
                else {
                    Interval v(start, end);
                    ans.push_back(v);
                    break;
                }
            }
            // reach the last interval
            if (nextIdx >= intervals.size()) {
                Interval v(start, end);
                ans.push_back(v);
            }

            idx = nextIdx - 1;
        }

        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值