我的朋友在测试中遇到一个问题,这个问题是:
例如,您将获得一个未排序的数组,其中整数值成对出现,而1个值作为单个出现:
[1,1,5,5,2,2,4,4,7,12,12,8,8]
输出为:
7
现在,我知道二进制搜索可以通过 O(log n)来做到这一点,但需要对数组进行排序。
那么如何在未排序数组的 O(log n)中完成此操作?
答案 0 :(得分:3)
如果足以注意到单例左侧的所有对都在偶/奇索引上,而右侧的对在奇/偶上。
由于可以在恒定时间内找到任意元素所属的对的奇偶校验,因此确实有可能进行二分法查找奇偶校验跃迁。
这仅在相邻对不同或相等对的行数不超过长度O(1)的情况下成立。例如,在所有8对中只有一个7搜索可以做到。
答案 1 :(得分:1)
如果值对彼此相邻,您还可以在未排序的数组中进行二进制搜索:
<n elements> <1 element> <n elements>
:答案 2 :(得分:1)
让我们考虑一下辅助数组,该数组由其他所有数字组成,如果等于下一个则分配0,否则分配1。
[1,1,5,5,2,2,4,4,7,12,12,8,8]
[0, 0, 0, 0, 1, 1 ]
此辅助数组已明确排序,可以通过二进制搜索找到第一个。
当然,不能显式构造数组,因为这会占用O(N)。