FG面经: Interval问题合集

本文介绍了一种在未排序区间列表中插入区间的O(N)复杂度算法。通过遍历列表,对比新旧区间来合并重叠区间,并最终插入新区间。文章还探讨了区间重叠的条件及查询数值是否位于已知区间的方法。

 

How to insert interval to an interval list. List is not sorted

O(N) solution:

 1 package fb;
 2 import java.util.*;
 3 
 4 class Interval {
 5     int start;
 6     int end;
 7     public Interval(int s, int e) {
 8         start = s;
 9         end = e;
10     }
11 }
12 
13 
14 public class InsertInterval {
15 
16 
17     
18     public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
19 
20         ArrayList<Interval> res = new ArrayList<Interval>();
21         for (Interval interval : intervals) {
22             if (interval.end < newInterval.start || interval.start>newInterval.end) {
23                 res.add(interval);
24             }
25             else {
26                 newInterval.start = Math.min(newInterval.start, interval.start);
27                 newInterval.end = Math.max(newInterval.end, interval.end);
28             }
29         }
30         res.add(newInterval);
31         return res;
32     }
33     
34     /**
35      * @param args
36      */
37     public static void main(String[] args) {
38         // TODO Auto-generated method stub
39         InsertInterval sol = new InsertInterval();
40         Interval i1 = new Interval(1,3);
41         Interval i2 = new Interval(6,9);
42         Interval i3 = new Interval(100,102);
43         List<Interval> intervals = new ArrayList<Interval>();
44         intervals.add(i2);
45         intervals.add(i1);
46         intervals.add(i3);
47         List<Interval> res = sol.insert(intervals, new Interval(3,7));
48         for (Interval each : res) {
49             System.out.print(each.start);
50             System.out.println(each.end);
51         }
52     }
53 
54 }

 

两个interval overlap条件:

interval1.end >= interval2.start && interval1.start <= interval2.end

 

问:一个query数在不在已经加入的区间?

如果interval是sorted, 就可以binary search, 插入位置的上一个interval, 判断是否在那个interval里面

如果没有sorted, 只能挨个比了

转载于:https://www.cnblogs.com/EdwardLiu/p/6358623.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值