【leetcode】57. (Hard) Insert Interval

题目链接


解题思路:
假设intervals是由很多blocks组成的,把这些blocks分成三个部分,一个是end的值都小于newInterval.start的部分,一个是和newInterval有重叠的部分,然后是start的值都大于newInterval.end的部分。

先将第一、三个部分求出来,分别放到headResult和tailResult中,然后判断一下中间部分和block之间的重叠情况即可。


提交代码:

class Solution {
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
    	List<Interval> headResult=new ArrayList<Interval>();
    	List<Interval> tailResult=new ArrayList<Interval>();
    	List<Interval> res=new ArrayList<Interval>();
    	Interval midResult=new Interval();

    	if(intervals==null||intervals.size()==0)	{
    		res.add(newInterval);
    		return res;
    	}
    	
    	int newIntervalStart,newIntervalEnd;
    	//find the start position of the overlap
    	for(newIntervalStart=0;newIntervalStart<intervals.size();newIntervalStart++) {
    		if(intervals.get(newIntervalStart).end<newInterval.start)
    			headResult.add(intervals.get(newIntervalStart));
    		else	break;
    	}
    	//check the relative position of head block and newInterval
    	boolean headInBlock=false;
    	if(newIntervalStart<intervals.size()&&
    			newInterval.start>intervals.get(newIntervalStart).start)
    		headInBlock=true;
    	
    	//find the end position of the overlap
    	for(newIntervalEnd=intervals.size()-1;newIntervalEnd>=0;newIntervalEnd--) {
    		if(intervals.get(newIntervalEnd).start>newInterval.end)
    			tailResult.add(intervals.get(newIntervalEnd));
    		else	break;
    	}
    	//check the relative position of tail block and newInterval
    	boolean tailInBlock=false;
    	if(newIntervalEnd>=0&&
    			intervals.get(newIntervalEnd).end>newInterval.end)
    		tailInBlock=true;

    	
    	//check the midResult
    	if(headInBlock)
    		midResult.start=intervals.get(newIntervalStart).start;
    	else 
    		midResult.start=newInterval.start;

    	if(tailInBlock)
    		midResult.end=intervals.get(newIntervalEnd).end;
    	else 
    		midResult.end=newInterval.end;
    	
    	//Combine the head,mid and tail result
    	res.addAll(headResult);
    	res.add(midResult);
    	for(int i=tailResult.size()-1;i>=0;i--)
    		res.add(tailResult.get(i));
    	
    	return res;
    }
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/AXIMI/article/details/84030475
今日推荐