LeetCode | Insert Interval 合龙区间

LeetCode | Insert Interval 合并区间

题目:

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

思路:

其实这个题目并不是很难,只不过非常麻烦,其实思路可以使用二分查找 找到合适的位置,一定要明白merge的first一定是在一个区间的第二个位置上 merge的第二个坐标点一定是在某一个区间的第一个位置上,找到位置 ,根据找到的信息再判断怎么删除区间。

在开始之前,需要查看是否有特殊情况,就是在第一个插入 ,或者在最后一个插入。

#include <iostream>
#include <vector>
#include <string>
using namespace std;

void Insert_interval(vector<pair<int,int> >& interval,pair<int,int>& merge)
{
	vector<pair<int,int> >::iterator itr;
	int i;
	int first =-1,second = -1;
	if(interval[0].first >merge.second )
	{
		interval.push_back(merge);
		swap(interval[0],interval[interval.size()-1]);
		return ;
	}
	
	if(interval[interval.size()-1].second <merge.first)
	{
		interval.push_back(merge);
		return ;
	}

	int begin=0,end = interval.size()-1;
	
	while(begin <interval.size() && end >=0 )
	{
		if( first == -1)
		{
			if(interval[begin].first <=merge.first && interval[begin].second >= merge.first)
				first = begin;
			else if(interval[begin].first >=merge.first && interval[begin].second >= merge.first)
				first = begin-1;
			else
				begin++;
		}
		if(second == -1)
		{
			if(interval[end].first <=merge.second && interval[end].second >= merge.second)
				second = end;
			else if(interval[end].first <=merge.first && interval[end].second <= merge.second)
				second = end+1;
			else
				end--;			
		}		
		if(second !=-1 && first != -1)
			break;
	}
	
	cout<<first<<"   ---  "<<second<<endl;
		 	
	if(interval[first].first < merge.first && interval[first].second >merge.first)	 
		interval[first].second = merge.first;
	/*
	else if(interval[first].first > merge.first && interval[first].second >merge.first)
	{
		interval[first-1].second = merge.first;
		first--;
	}
	*/
	if(interval[second].first<merge.second && interval[second].second > merge.second)
		interval[second].first = merge.second;
    
    interval.erase(interval.begin()+first+1,interval.begin()+second);
    
    if(interval[first].second == merge.first && interval[first+1].first == merge.second)
    {
    	interval[first].second =interval[first+1].second;
		interval.erase(interval.begin()+first+1); 
    }
}

int main()
{
	vector<pair<int,int> > interval;
	pair<int,int> pa(1,2);
	//pair<int,int> pa(1,3);
	pair<int,int> pa1(3,5);
	pair<int,int> pa2(6,9);
//	pair<int,int> pa2(6,9);
	pair<int,int> pa3(8,10);
	pair<int,int> pa4(12,16);
	
	interval.push_back(pa);
	interval.push_back(pa1);
	interval.push_back(pa2);
	interval.push_back(pa3);
	interval.push_back(pa4);
	
	pair<int,int> merge(4,9);
	
	Insert_interval(interval,merge);
	
	int i;

	return 0;
}