我正在努力解决面试实践问题。
问题是:
给出两个按升序排序的整数数组和一个整数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/
答案 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)
。