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

题意: 给定一组无重叠,且排序的区间,在其中插入一个区间,然后求合并之后的区间集合 。

此题可以参考上一题的解答过程,链接:点击打开链接

思路是,我们在区间集合中找到插入的区间的位置插入,保证插入之后的集合仍然有序,然后在使用上一题中的合并方法合并一次即可。

下面是代码:

public class Solution {
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        
        List<Interval> list = new ArrayList<>();
        List<Interval> list1 = new ArrayList<>();
        if(intervals.size() == 0){
            list1.add(newInterval);
            return list1;
        }
        if(newInterval == null)
            return intervals;
        
        boolean b = false;
        for(Interval in : intervals){
            if(newInterval.start<=in.start){
                list.add(newInterval);
                b = true;
            }    
            list.add(in);
        }
        if(b == false)
            list.add(newInterval);
        Interval ks = list.get(0);
        for(Interval inte : list){
            if(inte.start <= ks.end)
                ks = new Interval(ks.start,Math.max(inte.end,ks.end));
            else{
                list1.add(ks);
                ks = inte;
            }    
        }
        list1.add(ks);
        return list1;
    }
}



这是一种方法,另外,在此题中,由于给定的区间是已经排序的集合,那么我们同样可以使用3个循环来达到目的;

第一次循环,将所有小于插入区间并且与插入区间无重叠的区间直接存入集合中。

第二次循环,处理与插入区间有交集的部分集合,定义一个新的区间存入集合

第三次循环,将所有大于插入区间并且与插入区间无交集的区间存入集合

具体实现过程参考下面的代码:

public class Solution {
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        
        List<Interval> list = new ArrayList<>();
        
        if(intervals.size() == 0){
            list.add(newInterval);
            return list;
        }
        if(newInterval == null)
            return intervals;
        
        int i = 0;
        while(i<intervals.size() && newInterval.start > intervals.get(i).end){   //第一次循环,将在newInterval前面的区间加入集合
            list.add(intervals.get(i));
            i++;
        }
        int newStart = i==intervals.size() ? newInterval.start : Math.min(newInterval.start,intervals.get(i).start);
            //定义新区间的起始位置
        while(i<intervals.size() && newInterval.end >= intervals.get(i).start){ //第二次循环
            i++;
        }
        int newEnd = i==0 ? newInterval.end : Math.max(newInterval.end,intervals.get(i-1).end);
            //定义新区间的末位置
        list.add(new Interval(newStart,newEnd));
        while(i<intervals.size()) //第三次循环,将剩余区间加入集合
            list.add(intervals.get(i++));
        
        return list;
    }
}


这是一种比较优化的方法,很不错。在LeetCode上超越了96.35的答案!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值