56 - Merge Intervals

本文讨论了如何在一组互不重叠的区间中插入一个新区间,并在必要时进行合并。通过排序和遍历,实现对区间的有效管理和更新。

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).

You may assume that the intervals were initially sorted according to their start times.

Example 1:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].

Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].

This is because the new interval [4,9] overlaps with [3,5],[6,7],[8,10].

Subscribe to see which companies asked this question

思路分析:

To check the intersections between interval [a,b] and [c,d],  there are four cases (equal not shown in the figures):
    a____b
c____d

a____b
     c____d

a_______b
    c___d

   a___b
c_______d

But we can simplify these into 2 cases when check the smaller (smaller start point) interval with the bigger interval.
For the problem, the idea is simple. First sort the vector according to the start value. Second, scan every interval, if it can be merged to the previous one, then merge them, else push it into the result vector.
Note here:
The use of std::sort to sort the vector, need to define a compare function, which need to be static. (static bool myfunc() ) The sort command should be like this:  std::sort(intervals.begin,intervals.end, Solution::myfunc); otherwise, it won't work properly.


/*
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].
*/

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>



using namespace std;

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

class Solution_056_MergeIntervals
{
public:
	static bool myfunc(const Interval &a, const Interval &b)
	{
		return (a.start < b.start);
	}

	vector<Interval> merge(vector<Interval> &intervals)
	{
		vector<Interval> res;

		if (intervals.size() == 0)
		{
			return res;
		}

		sort(intervals.begin(), intervals.end(), myfunc);
		res.push_back(intervals[0]);

		for (int i = 1; i < intervals.size(); i++)
		{
			/*
				a_____b
				    c____d
				或者
				a____b
				  c_d
			*/
			if (res.back().end >= intervals[i].start)
			{
				res.back().end = max(res.back().end, intervals[i].end);
			}

			/*
				a____b
						c____d
			
			*/
			else
			{
				res.push_back(intervals[i]);
			}
		}

		return res;

	}

};


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值