我有一系列间隔,我想找到重叠次数最少的间隔。
例如:
输入:
[(1.1, 10.1), (2.1,10.1), (3.1, 10.1)]
因为(1.1,2.1)重叠1次,(2.1,3,1)重叠2次,(3.1,10.1)重叠3次。 返回(1.1,2.1)
我的解决方法:
1。创建一个dict(name f_int)以将所有数字保存在输入中。{0:1.1,1.2.1,2:3.1 ...}
2。创建一个长度为2 * len(f_int)-1的列表名称直方图,所有项目均为0。奇数索引表示其两个相邻元素的“间隔”。
3.Traversal输入,介于f_int [each.start]和f_int [each.end] + = 1之间的所有
4。在具有奇数索引的直方图中找到最小值,其两个相邻元素是结果
它可以工作,但是当f_int大时,它很慢(花很多时间在3中)
def find_least_overlap(intervals):
all_nums = sorted([p for interval in intervals for p in interval])
# 1
f_int = {}
int_f = {}
i = 0
for n in all_nums:
try:
f_int[n]
except:
f_int[n] = i
int_f[i] = n
i += 1
# 2
histogram = [0 for i in range(2*i-1)]
# 3
for interval in intervals:
for _ in range(2*f_int[interval[0]], 2*f_int[interval[1]]+1):
histogram[_] += 1
# 4
aim = [histogram[i] for i in range(len(histogram)-1) if i % 2 == 1]
min_overlap = aim.index(min(aim)) * 2 + 1
pre_item = (min_overlap - 1) / 2
next_item = (min_overlap + 1) / 2
return int_f[pre_item], int_f[next_item]
答案 0 :(得分:1)
创建(time, flag = +-1 for start or end of interval)
对的列表
按时间排序列表。
在平局的情况下,还要考虑开始/结束标志(如果像[1,4]和[4,7]这样的间隔不应相交,则给出零长度的相交范围,则在开始之前结束)
制作overlapping = 0
遍历列表,为每对添加标记到overlapping
overlapping
发生变化-输出范围结束时,新的范围开始
将overlapping
与当前最小值(不包括起始0)进行比较