【LeetCode】Merge Intervals && Insert Interval

参考链接

Insert Interval
http://blog.csdn.net/worldwindjp/article/details/21612731

http://blog.csdn.net/littlestream9527/article/details/17686435



http://www.cnblogs.com/remlostime/archive/2012/11/25/2787387.html


题目描述

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




题目分析

Merge Intervals 
 首先按start 排序 ,
 设置一个start,end
 如果 end <  intervals[i].start 就可以把 (start,end),添加进去
 如果 end <  intervals[i].end 就把end更新为  intervals[i].end,也就是把 intervals[i]合并入(start,end)
 如果 end >= intervals[i].end 说明  intervals[i] 已经在  (start,end) 不用处理 

Insert Interval
方法一,把newInterval插入按start排序的位置。然后执行merge interval
方法二,找到start和end插入的位置。见代码注释



class Solution {
public:
    vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
        vector<Interval> ret;
		int size = intervals.size();
        //TODO size 1
        
        int i = 0;
        
		int start = 0, end = 0;
        for(i = 0;i<size;i++)
        {
        	if(intervals[i].start> newInterval.end)//这里i后的都不用处理 
        		break;
		}
		end = i;
		
		for(;i>=0;i--)
        {
        	if(i<size && intervals[i].end < newInterval.start)//这里i之前的都不用处理 
        		break;
		}
		start = i;
		
		for(i = 0;i<=start;i++)//start之前的肯定是和新插入的 没有交集的 
		{
			ret.push_back(intervals[i]);
		}
		
		if(start + 1 < size && newInterval.start > intervals[start+1].start)
			newInterval.start = intervals[start+1].start;
			
		if(end>0 && newInterval.end < intervals[end-1].end)
			newInterval.end = intervals[end-1].end;
		
		ret.push_back(newInterval);
		
		for(i = end;i<size;i++)//end之后的肯定是和新插入的 没有交集的 
		{
			ret.push_back(intervals[i]);
		}
        return ret;
    }
};




	 bool comp(const Interval &a, const Interval &b)
	{  
	    if(a.start==b.start)return a.end<b.end;
	    return a.start<b.start;
	}
class Solution {
public:

	
    vector<Interval> merge(vector<Interval> &intervals) {
        vector<Interval> ret;
        int size = intervals.size();
        
        sort(intervals.begin(),intervals.end(),comp);
        
        if(size < 1) return ret;
        int start = intervals[0].start;
        int end = intervals[0].end;
        for(int i = 1;i<size;i++)
        {
        	if(end < intervals[i].start)
        	{
        		ret.push_back(Interval(start,end));
        		start = intervals[i].start;
        		end = intervals[i].end;
			}
			if(end < intervals[i].end)
				end = intervals[i].end;
		}
		ret.push_back(Interval(start,end));
		return ret;
    }
};



推荐学习C++的资料

C++标准函数库
在线C++API查询
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值