两个有序数组中的Top K问题C实现
#include <stdio.h>
#define MAX(a, b) (a) > (b) ? (a) : (b)
int findK(int a[], int lena, int b[], int lenb, int k);
int A[] = {1, 9, 10, 20, 31, 33, 40, 45, 55, 64, 77, 78, 79, 88, 90, 95, 99};
int B[] = {3, 7, 8, 10, 20, 43, 44, 45, 55, 83};
int main() {
printf("findKMean=%d\n", findK(A, 17, B, 10, 12));
return 0;
}
/**
* @param a: 数组a
* @param lena: 数组a的长度
* @param b: 数组b
* @param lenb: 数组b的长度
* @param k: 目标
* @return 第k大的数 */
int findKMean(int a[], int lena, int b[], int lenb, int k) {
int total = lena + lenb;
if (lena + lenb < k) {
return -1;
} else if (lena == 0) {
return b[k - 1];
} else if (lenb == 0) {
return a[k - 1];
}
int ca = lena * k / total;
int cb = k - ca;
int la, lb, ra, rb;
// 重新计算数组切割结果
RE_CALC:
la = a[ca - 1];
ra = a[ca];
lb = b[cb - 1];
rb = b[cb];
if (la > rb) {
goto CASE_A;
} else if (lb > ra) {
goto CASE_B;
} else {
goto END;
}
// 第一种情况: La > Rb
CASE_A:
if (--ca == 0) {
return b[k - 1];
}
if (++cb == lenb) {
return a[k - lenb - 1];
}
goto RE_CALC;
// 第二种情况: Lb > Ra
CASE_B:
if (++ ca == lena) {
return b[k - lena - 1];
}
if (--cb == 0) {
return a[k - 1];
}
goto RE_CALC;
// 计算终止
END:
return MAX(la, lb);
}
参考:
[1]: https://www.cnblogs.com/voidsky/p/5373982.html