Skip to content

Instantly share code, notes, and snippets.

@hazirguo
Created August 14, 2014 04:01
Show Gist options
  • Save hazirguo/a70873934b56bf1f8f75 to your computer and use it in GitHub Desktop.
Save hazirguo/a70873934b56bf1f8f75 to your computer and use it in GitHub Desktop.
两个有序数组任意两个数之和找最小的 k 个数

##问题

给定两个有序的数组 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)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment