【发布时间】:2021-07-14 18:35:12
【问题描述】:
我必须从排序的范围数组中找到最频繁的数字(或模式)。此范围仅由包含的开始和结束编号组成。 例如,arr[0] 可以包含数字 {0, 3},这意味着数字 {0, 1, 2, 3}。范围按起始编号排序,当起始编号相等时,它们按结束编号排序。两者都按升序排列。
数组中填充了 n 个这些范围。我需要找到一种方法来找到出现在最多范围内的数字。
我想到了一个解决方案,它遍历所有数字一次,但这是在 O(n * m) 中,其中 m 是范围的平均长度。对于我正在处理的大小,这是一个非常慢的算法。
我还研究了一些更快的解决方案,例如this,但是当您无法轻松找到第 k 个数字时,我想不出一种有效的方法来实现它,因为范围的大小可能大相径庭。
我目前正在尝试在 C 中实现这一点,但非常感谢任何想法或与此相关的资源的链接。
【问题讨论】:
-
您的问题标题提到了一组 排序 范围。它们是按起始编号还是其他方式排序的?
-
按起始编号排序,如果起始编号相同,则按结束编号排序。我会将这些信息添加到我的帖子中。
-
范围可以有多大?最大可以有多少范围?
-
10^8 范围。每个范围可以在 0 到 2^32 - 1 之间
-
如果几个数字(不一定是连续的)是最频繁的怎么办?例如,如果没有任何范围重叠,则该范围集中的所有数字仅出现 1 次。