【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;
    }
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值