繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM