[英]Kth Smallest SUM In Two Sorted Arrays - Binary Search Solution
我正在努力解决面试实践问题。
问题是:
给定两个按升序排序的整数数组和一个整数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/
您可以求解二进制搜索和滑动窗口,时间复杂度为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)
的对的数量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]
的x的最大值a[i] + b[x] <= S --> b[x] <= S - a[i]
对于O(log M)
a[i] + b[x] <= S --> b[x] <= S - a[i]
。
因此,您可以为O(log M)
求解x的值,因为它等于x + 1。
O(N + M)算法
实际上,如果你做i++
,x的值等于或小于x的先前值。
所以你可以使用滑动窗口算法和。
你可以求解O(N + M),因为你必须操作i++
N次,并且操作x--
M次。
解决这个主要问题
您可以对S进行binary_search,并且可以解决不等式(counting problem's answer <= K)
。
答案是S的最大值。
时间复杂度是O((N + M) log maxvalue)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.