1、有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列,对于1<=i,j<=k,求k个最小的(ai+bj),要求算法尽量高效。
因为A,B每个大小为k,最后要求k个最小的,因此,肯定在A中第一个和B中所有相加,与B中第一个和A中所有相加,这2k个数字中。
设i,j两个指针,分别指向AB两个序列,设才c[k]存储最小值
c[n++] = A[1]+B[1];
i=j=2;
while(i<=k && j<=k)
{
if(A[1]+B[1+i] < B[1]+A[1+j] )
{ c[n++] = A[1]+B[1+i]; i++; }
else
{ c[n++] = B[1]+A[1+j]; j++; }
}
时间复杂度是O(k)。
线性复杂度已经挺高效了,不过注意到题目中只要求前k个并不需要排序,而且原序列已经有序,对于有序表来说,二分法不得不考虑,一旦成功,就是logn的复杂度,大大减小。
首先说A[1]+B[i] i=1,2, ....k, B[1]+A[j], j=1,2,3.......k
f