我已经做了这个练习,在那里我无法弄清楚我错过了什么。它实际上与现有问题非常相似,但不一样,解决方案可能不一样。 现有问题:Finding the most frequent number from a set of ranges -
问题:
在[0,n d ]范围内给出n个范围[a i ,b i ],其中d为一个常数正整数。 a i ,b i 也是整数,0< = a i < = b i < ; = n d 每个i(i = 1,...,n)。
编写算法以查找出现在最大量范围内的整数z [a i ,b i ]。复杂性必须是线性的(作为n,d的函数)。
在我看来,这是一个经典的计数/基数排序问题:使用k = n作为基数,排序的复杂度变为O(d * n)。问题是,下一步该怎么做?我有点卡在这上面了。在相关问题中,假设范围只能是一定的大小,而在我的问题中没有这样的假设,理论上可以有[0,n d ]的范围以及介于两者之间的任何事情。
随机示例:
Input: [1, 3], [5, 10], [5, 11], [6, 17], [8, 9], [9, 21], [11, 15], [12, 12] Output: 9
答案 0 :(得分:2)
排序是一个好主意(基数排序似乎是要走的路),但我不会对间隔进行排序。相反,我会使用扫描线样式方法。想象一下从0到n ^ d的数字线上绘制的区间。现在我们从左到右“扫”。
有趣的是我们当前位置相交的间隔数可以改变的情况,是我们间隔的起点/终点。请注意,我们也可以选择其中一个起点或终点作为解决方案。
所以我们只考虑这些点并从左到右扫描:
events = start points UNION end points
sort events (rank start points before end points in case of a tie)
count = 0
max = 0
for each event x in sorted order
if x is start point
count++
if x is end point
count--
if count > max
max = count
result = x