两个递增排序的整数序列 A, B,长度同为N,求前K个最小的 a[i] + b[j]
递增排序的整数序列 A={a(i)}
、B = {b(j)}
长度同为 N,两个数组相加得到 N2 个数,再对这些数进行排序,算法时间复杂度很高啊。有什么更好的办法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
递增排序的整数序列 A={a(i)}
、B = {b(j)}
长度同为 N,两个数组相加得到 N2 个数,再对这些数进行排序,算法时间复杂度很高啊。有什么更好的办法吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
数据集定义
将M(n*n)矩阵分为三个区域:
操作
复杂度
S集最多为min(K, n). 所以时间复杂度为
O(K*log(min(K, n)))
代码示例
用小顶堆 应该可以减少一些时间复杂度. 不过我们可以试试用搜索的办法.
建立 大小为min(N, K)的一维数组A. 对应到二维来说, A[i] 表示 对第i行 的最右的被选的点. 如此可以把 解空间 分为(已选, 未选) 两部分. 这样判定 某点(x, y)是否被选, y <= A[i] 即被选中.
注:这里可以用 N x N的 状态矩阵 来理解, 标识 "两个数组相加得到 N2 个数" 的状态, x.y表示a[x]+b[y] 的状态. 初始化 M 为: M0.0 为 已选出, M0.1 和 M1.0 为 "待选", 其他为 "未选"
说明:
写了java的实现, 这里 待选集 用了java内置的 PriorityQueue, 其基本操作都是logN的.
A B -> sort asc