插入区间,区间合并

插入区间

插入区间[2, 5] 到 [[1,2], [5,9]],我们得到 [[1,9]]。
插入区间[3, 4] 到 [[1,2], [5,9]],我们得到 [[1,2], [3,4], [5,9]]。

合并区间

给出的区间列表 => 合并后的区间列表:

[ [
[1, 3], [1, 6],
[2, 6], => [8, 10],
[8, 10], [15, 18]
[15, 18] ]
]

插入区间可以认为是对无序区间列的合并操作

有序区间序列的合并

区间按照左端点排序
遍历全部有序区间
[1, 3] ,添加区间,start = 1,end = 3
[2, 6],发现2是小于end的,说明当前这个区间和前面的是连续区间,所以start值不用变,只需要更新end值,end = 6。
[8, 10],发现8比6大,所以当前这个区间和前面的区间是不连续的,第一区间添加完成,添加第二区间,start = 8和end = 10
如此循环

很容易发现,只需要按照区间序列遍历全部区间,循环内根据不同情况用if处理就行了

区间插入及合并

在合并区间的基础上,先对区间序列进行排序然后进行合并即可

Foreach用法

foreach的语句格式:
for(ElementType item : Element){
/Do something/
}

/**
 * Definition of Interval:
 * public classs Interval {
 *     int start, end;
 *     Interval(int start, int end) {
 *         this.start = start;
 *         this.end = end;
 *     }
 */
class Solution {
    /**
     * Insert newInterval into intervals.
     * @param intervals: Sorted interval list.
     * @param newInterval: A new interval.
     * @return: A new sorted interval list.
     */
    public ArrayList<Interval> insert(ArrayList<Interval> intervals, Interval newInterval) {
        ArrayList<Interval> result = new ArrayList<Interval>();
        // write your code here
        if(intervals.size() == 0)
        {
            result.add(newInterval);
            return result;
         }

        //先排序
        intervals.add(newInterval);
        Collections.sort(intervals,new Comparator<Interval>(){
            @Override
            public int compare(Interval o1,Interval o2){
                return   o1.start - o2.start;
            }
        });
        //选取区间
        Interval prev = null;
        for (Interval item : intervals) {

            if (prev == null || prev.end < item.start) {
                System.out.println(item.start);
                System.out.println(item.end);
                result.add(item);
                prev = item;            //指向同一对象
            } else if (prev.end < item.end) {
                prev.end = item.end;        //更改区间尾
            }
        }


        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值