avatar
LinkedIn 的一道onsite题# JobHunting - 待字闺中
e*8
1
从网上看来的一道面经,不知道如何解最优,求大神指点。。。
给你一个java interface, 实现两个method,一个是void add interval(int from,
int to), 另一个是int getTotalLength()返回已有interval的总时间,当然,要考虑
overlapping。比如(1,5), (2, 6)的total length 是5.
不知道用什么样的data structure 去解决。
avatar
a*1
2
segment tree.
avatar
l*3
3
考虑如何向不交的interval集合里面插入一个新的interval。
leetcode上的题。

【在 e********8 的大作中提到】
: 从网上看来的一道面经,不知道如何解最优,求大神指点。。。
: 给你一个java interface, 实现两个method,一个是void add interval(int from,
: int to), 另一个是int getTotalLength()返回已有interval的总时间,当然,要考虑
: overlapping。比如(1,5), (2, 6)的total length 是5.
: 不知道用什么样的data structure 去解决。

avatar
e*8
4
这样的话,可能需要维护一个sorted interval array,以他们的开始时间排序。每次
插入,都得O(n) 时间复杂度,会不会效率不高?

【在 l*3 的大作中提到】
: 考虑如何向不交的interval集合里面插入一个新的interval。
: leetcode上的题。

avatar
e*8
5
能不能展开介绍下。。。谢谢!

【在 a******1 的大作中提到】
: segment tree.
avatar
c*m
6
如果https://leetcode.com/problems/insert-interval/的最好方法是O(N)的,那我觉
得也不会有O(logn)的方法了吧。不认为这题能用segment tree做,可能我对segment
tree的用法还不够了解

【在 e********8 的大作中提到】
: 这样的话,可能需要维护一个sorted interval array,以他们的开始时间排序。每次
: 插入,都得O(n) 时间复杂度,会不会效率不高?

avatar
l*3
7
也不能简单理解为O(n),你可以用BST来存储interval,这样如果是要新添入一个
interval,就是O(log n),如果是要修改并合并之前k个interval,那确实需要 O(k
log n)的运算量,但是好处是做完你少了k个interval。我觉得总的来说,至少粗浅的
想,是不会有更好的数据结构了 (up to log complexity),因为看上去至少你总是
要维护若干个不相交的interval的,
比如如果你当前的interval是[0,1], [2,3], [4,5], [6,7] 这种,那看上去只能分别
存了,没有什么好的方法可以节省时间和空间代价。

【在 e********8 的大作中提到】
: 这样的话,可能需要维护一个sorted interval array,以他们的开始时间排序。每次
: 插入,都得O(n) 时间复杂度,会不会效率不高?

avatar
l*3
8
我也不认为这种问题适合线段树来处理
线段树处理连续区间的问题比较好,区间断断续续的话感觉搞不动。
avatar
A*s
9
如果存在的 interval 不能合并成一个,返回的 totalLength 该怎么定义呢?
比如已有 (1,5) (6,7)

【在 e********8 的大作中提到】
: 从网上看来的一道面经,不知道如何解最优,求大神指点。。。
: 给你一个java interface, 实现两个method,一个是void add interval(int from,
: int to), 另一个是int getTotalLength()返回已有interval的总时间,当然,要考虑
: overlapping。比如(1,5), (2, 6)的total length 是5.
: 不知道用什么样的data structure 去解决。

avatar
r*g
10
我觉得这题就是Merge Intervals。两个办法,一个是bst维护独立的不同的interval,
每个node是一个interval,这个缺点是无法删除interval,因为interval已经被merge
在一起了,而且插入的code不好写,好处是,可以很快的获得TotalLength。另外一个
办法当然就是interval tree了,网上有详细方法,用最基本的interval tree就可以,
好处是,插入操作非常easy,坏处是,不同node之间其实可能会overlap,所以最后
merge的时候需要注意,merge的开销应该是O(N)吧。所以理论最快的是BST tree,但是
interval tree很容易写。
不知道segment tree怎么写。
avatar
r*g
11
如果已经sorted了,binary search就可以获得新的interval应该插入的位置,所以这
题确实可能考察的就是leetcode insert interval原题。

【在 e********8 的大作中提到】
: 这样的话,可能需要维护一个sorted interval array,以他们的开始时间排序。每次
: 插入,都得O(n) 时间复杂度,会不会效率不高?

avatar
w*d
12
merge时用lazy delete+pointer会快很多,否则还是O(n)

【在 r*******g 的大作中提到】
: 如果已经sorted了,binary search就可以获得新的interval应该插入的位置,所以这
: 题确实可能考察的就是leetcode insert interval原题。

avatar
s*g
13
用bst, 每个节点存interval[low, high]。所要维护的属性是树里的父节点的low要
大于左子节点的high,父节点的high要小于右子节点的low。 每次插入新节点的时候比
较路径节点上的interval, 并且更新插入节点的low/high值. 比如输入节点为[1,5
], [7,9], [6,13], [4,7]。
插入第一个节点时,树结构为 [1,5];
插入第二个节点时,树结构为
[1, 5]
[7,9]
插入第三个节点时,树结构为
[1, 5]
[7, 9]
[6, 7] [9, 13]
[6, 13]与[7,9]比较的时候会裂变成两个节点:[6, 7], [9, 13]。
插入第四个节点时,树结构为
[1, 5]
[7, 9]
[6, 7] [9, 13]
[5, 6]
[4,7]与[1,5]比较的时候会变成[5,7];[5,7]与[6,7]比较的时候会变
成[5,6]
每次插入复杂度为o(logN), 最后算总长度,遍历一次树就行,复杂度为o(N). 这个解
法有点类似于skyline的bst解法, http://www.shadabahmed.com/blog/2013/04/24/skyline-algorithm-a-binary-tree-approach/. 不同的是 skyline 的线段有不同的高度,这里的险段的高度默认为1.
avatar
r*g
14
你这个方法好,每插入一个interval时候不需要merge node, 而是把interval本身分裂
成多段。
不过用bst的问题就是不能删除interval,还是只有interval tree才能删除interval。

5

【在 s********g 的大作中提到】
: 用bst, 每个节点存interval[low, high]。所要维护的属性是树里的父节点的low要
: 大于左子节点的high,父节点的high要小于右子节点的low。 每次插入新节点的时候比
: 较路径节点上的interval, 并且更新插入节点的low/high值. 比如输入节点为[1,5
: ], [7,9], [6,13], [4,7]。
: 插入第一个节点时,树结构为 [1,5];
: 插入第二个节点时,树结构为
: [1, 5]
: [7,9]
: 插入第三个节点时,树结构为
: [1, 5]

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。