找两个排好序的数组的中间值,实际上可以扩展为寻找第k大的数组值。
参考下面的思路,非常的清晰:
代码:
double findMedianofTwoSortArrays(int A[], int B[], int m, int n) { int total = m + n; //判断序列长度的奇偶,奇数只有一个中间值,偶数有两个中间值,取平均 if (total & 0x1) return find_kth(A, m, B, n, total / 2 + 1); else return (find_kth(A, m, B, n, total / 2) + find_kth(A, m, B, n, total / 2 + 1)) / 2; } int find_kth(int A[], int m, int B[], int n, int k) { //设定m<=n if (m > n)return find_kth(B, n, A, m, k); if (m == 0)return B[k - 1]; if (k == 1)return min(A[0], B[0]); //删除掉一部分数据 int ia = min(k / 2, m), ib = k - ia; if (A[ia - 1] < B[ib - 1]) return find_kth(A + ia, m - ia, B, n, k - ia); else if (A[ia - 1]>B[ib - 1]) return find_kth(A, m, B + ib, m - ib, k - ib); else return A[ia - 1]; }
时间: 2024-11-05 18:59:10