【发布时间】:2017-02-17 07:51:35
【问题描述】:
我在电话采访中遇到了这个问题:
假设有一个范围列表。例如,[[1-6]、[10-19]、[5-8]]。 编写一个返回组合范围列表的函数 这样函数的输入 [[1-6],[10-19],[5-8]] 返回 [[1,8],[10,19]](只有开始和结束编号)。注意,输入列表 可能包含任意数量的 范围。
我对这个问题的解决方法是:
将所有范围列表合并为一个列表: [[1-6],[10-19],[5-8]] -> [1-6,10-19,5-8]
对列表执行排序: list = Sorted(list) -> [1,2,3,4,5,5,6,6,7,8,10...]
使用 list = set(list) 去掉多余的数字
遍历列表并找到范围
我知道这个解决方案绝对是他们正在寻找的(这就是我面试失败的原因),因为时间复杂度是 O(nlogn)(排序),n 是范围内不同数字的数量。
python 专家能否给出一个 O(n) 的解决方案,n 为原始列表中的范围数?
【问题讨论】:
-
可以有空范围吗?
-
您的意思是说这绝对是不是他们正在寻找的东西吗?
-
范围内数字的最大值是多少,例如如果范围是 [x,y],x 和 y 的最大值是多少?如果它更少,你可以在 O(max_val(x))
标签: python algorithm list sorting