我们有两个相同大小的排序数组n。我们称之为数组a和b。
如何找到由a和b合并的排序数组中的中间元素?
Example:
n = 4
a = [1, 2, 3, 4]
b = [3, 4, 5, 6]
merged = [1, 2, 3, 3, 4, 4, 5, 6]
mid_element = merged[(0 + merged.length - 1) / 2] = merged[3] = 3
更复杂的案例:
案例1:
a = [1, 2, 3, 4]
b = [3, 4, 5, 6]
案例2:
a = [1, 2, 3, 4, 8]
b = [3, 4, 5, 6, 7]
案例3:
a = [1, 2, 3, 4, 8]
b = [0, 4, 5, 6, 7]
案例4:
a = [1, 3, 5, 7]
b = [2, 4, 6, 8]
所需时间:O(log n)。有什么想法吗?
答案 0 :(得分:10)
查看两个阵列的中间部分。假设一个值较小而另一个值较大。
使用较小的值丢弃数组的下半部分。丢弃具有较高值的数组的上半部分。现在我们留下了我们开始时的一半。
冲洗并重复,直到每个阵列中只剩下一个元素。返回那两个中较小的一个。
如果两个中间值相同,则任意选择。
答案 1 :(得分:1)
非常有趣的任务。我不确定O(logn),但解决方案O((logn)^ 2)对我来说是显而易见的。 如果你知道第一个数组中某个元素的位置,那么你可以找到两个数组中有多少个元素然后这个值(你知道第一个数组中有多少个较小的元素,你可以使用二进制找到第二个数组中较小元素的数量搜索 - 所以只需总结这两个数字)。因此,如果你知道两个数组中较小元素的数量小于N,你应该在第一个数组中查看上半部分,否则你应该移动到下半部分。因此,您将获得内部二进制搜索的一般二进制搜索。总体复杂性将为O((logn)^ 2)
注意:如果您在第一个数组中找不到中位数,则在第二个数组中开始初始搜索。这不会对复杂性产生影响
答案 2 :(得分:0)
所以,拥有 n = 4和a = [1,2,3,4]和b = [3,4,5,6]
你基于n知道结果数组中的第k个位置,它等于n。 结果第n个元素可以是第一个数组或第二个数组。 让我们首先假设元素在第一个数组中 从[l,r]开始二元搜索中间元素,在开头l = 0,r = 3; 因此,使用中间元素,您知道同一数组中有多少元素较小,即中间 - 1。 知道中间1元素较少并且知道你需要第n个元素,你可能会让第二个数组中的[n - (middle-1)]元素更小,更大。如果那个更大且普遍的元素更小,那就是你需要的东西,如果它更大而且之前也更大,我们需要L =中间,如果它更小r =中间。 如果您没有找到第一个解决方案,请为第二个阵列执行相同操作。 总log(n)+ log(n)