我正在寻找一种算法,可以在 O(n)
时间内解决以下问题:
- 给定一个无序的整数数组,长度为
n
(例如{3, 5, 1}
)。 - "相邻的" 意味着从有序数组
{1, 3, 5}
中选择两个数字,并使它们相邻。
找到任意一对相邻数字中差值最大的数字。不需要确定选取哪些元素,它们在哪里,或实际排序数组。
我只能找到一种需要巨大内存空间用于计数的方法。将所有输入中的数字标记在其中,然后扫描比特图以查找最长的零序列。(这是一种去重的 计数排序,因此仅需要对每个可能的输入数字使用一位饱和计数器。)
该比特图解决方案更加适合于 O(n+m)
的情况,其中 m
是所需比特图的大小=最大输入-最小输入。包含 INT_MAX 和 INT_MIN 的小输入数组是该方法的最坏情况。
如果需要或有帮助,请假设整数均为 机器字 int
,而不是任意整数。
O(nlogU)
,其中U
是元素的范围。如果范围大于元素数量,则会得到logn<logU
。这只有在存在许多重复项的情况下才有助于渐近复杂度。 - amitO(log U)
,因为它最多应该比较log U
个不同的位。对于减法等数学运算也是一样(应处理log U
位)。因此,即使在排序数组中,问题也无法在O(n)
内解决。 - Tagir Valeev