题目:设A和B都是从小到大已经排好序的n个不等的整数构成的数组, 如果把A与B合并后的数组记作C,设计一个算法找出C的中位数。
解题思路:
思路一:
对将A和B合并数组成C,并且进行排序,然后直接输出中位数。
该算法的时间复杂度为:O(nlogn),空间复杂度为:O(n)。
思路二:
利用分治法。
假定A[0,……,n-1] 和 B[0,……,n-1] 是输入数组,令k = [n/2] (向下取整),取A[k] 和 B[k]比较。
- 如果A[k] == B[k],则A[k]就是所求的中位数,直接输出,算法结束;
- 如果A[k] < B[k],则A[0,……,k-1] 和 B[k+1,……,n-1] 不含有C的中位数,直接舍弃,下一步递归查找的子问题是A[k,……,n-1] 和 B[0,……,k](注:C中位数必定在这个区间之内);
- 如果A[k] > B[k],则A[k+1,……n-1] 和 B[0,……,k-1]不含有C的中位数,直接舍弃,下一步递归查找的子问题是A[0,……,k] 和 B[k,……,n-1].
- 当n == 1,A和B中都只剩下一个数,那么取中位数mid = (A[1] + B[1])/2,算法结束;
该算法每次将子问题减半(至多差常数1)。
时间复杂度满足方程:
W(n) = W(n/2) + 1
W(1) = 1
解该方程得:W(n) = O(logn),即时间复杂度为:O(logn)