##问题
给定两个有序的数组 A 和 B,它们任意的两个数之和组成一个包含 N^2 个元素的数组,找出该数组中最小的 k 个数。
##解法
如果直接对这个新的数组进行排序,即使使用较快的快排或堆排序,总的时间复杂度为 N^2 * log(N^2) * k = 2 * k * N^2 * log(N)
。
那么有什么更高效的解法吗?
由于这两个数组有序,那么两个数组中元素之和满足以下关系:
A[1]+B[1] <= A[1]+B[2] <= A[1]+B[3] <= ... <= A[1]+B[N]
A[2]+B[1] <= A[2]+B[2] <= A[2]+B[3] <= ... <= A[2]+B[N]
...
A[N]+B[1] <= A[N]+B[2] <= A[N]+B[3] <= ... <= A[N]+B[N]
N^2 个数构成了上面 N 个有序的序列,那么问题就转化为 在这 N 个有序的序列中,找到 k 个最小的值。这个问题就比较简单了,只要在这 N 个序列的最小值中取最小值,从序列中删除该元素,重复 k 次,那么删除的 k 个元素就是 k 个最小的值。
如果每个序列使用 堆 的数据结构来组织,那么,总的时间复杂度为: k * N * log(N)
。