两个排序数组中的最小和 - 二进制搜索解决方案

时间:2016-11-28 04:39:32

标签: algorithm binary-search

我正在努力解决面试实践问题。

问题是:

  

给出两个按升序排序的整数数组和一个整数k。定义sum = a + b,其中a是第一个数组中的元素,b是第二个数组中的元素。找出所有可能总和中的第k个最小和。

     

例如

     

给出[1,7,11]和[2,4,6]。

     

对于k = 3,返回7.

     

对于k = 4,返回9.

     

对于k = 8,返回15.

我们将n定义为A的大小,将m定义为B. 我知道如何使用堆(O(k log min(n,m,k))时间复杂度来解决它。但问题是有另一种二元搜索方法用O((m + n)log maxValue)来做,其中maxValue是A和B中的最大数。任何人都可以使用二进制来解决它的一些注释搜索

我的想法是我们可以使用x = A [] + B []作为搜索对象,因为第k个x就是我们想要的。如果是这样,如何在二进制搜索中更新x?如何检查更新的x是否有效(这样的一对是否真的存在)?

谢谢

最初的问题在这里: https://www.lintcode.com/en/problem/kth-smallest-sum-in-two-sorted-arrays/

1 个答案:

答案 0 :(得分:0)

您可以求解二进制搜索和滑动窗口,时间复杂度为O((N + M) log maxvalue)

让我们考虑解决这个问题(我称之为计算问题)。

  

给定整数N,M,S,序列a和b。
  序列a的长度恰好是N.   序列b的长度正好是M.
  序列a,b被排序。
  请计算满足a[i]+b[j]<=S (0<=i<=N-1, 0<=j<=M-1)的对数。

实际上,这个计数问题可以在O(N log M)时间内解决二进制搜索
令人惊讶的是,这个问题可以解决O(N+M)

二进制搜索算法
您可以为a[i] + b[x] <= S --> b[x] <= S - a[i]求解满足O(log M)的x的最大值。
因此,您可以求解O(log M)的x值,因为它等于x + 1。

O(N + M)算法
实际上,如果执行i++,则x的值等于或小于x的先前值。
所以你可以使用滑动窗口算法和。
您可以求解O(N + M),因为您必须执行N次操作i++,并且操作x-- M次。

解决这个主要问题
您可以使用binary_search for S来解决不等式(counting problem's answer <= K)
答案是S.的最大值 时间复杂度为O((N + M) log maxvalue)