/*
* 算法思想:
* 1. 详见注释;
* 2. 参考博客:https://blog.csdn.net/xiaomucgwlmx/article/details/87879306
*/
int min(int a, int b){
return a<b ? a:b;
}
/*
* 寻找两个数组合并后的第K个元素
*/
int findKth(int* arr1, int len1, int * arr2, int len2, int k) {
int val1, val2;
if(len1 <= 0) return arr2[k-1];
if(len2 <= 0) return arr1[k-1];
if(k==1) return min(arr1[0], arr2[0]);
val1 = (k/2 > len1) ? INT_MAX : arr1[k/2-1];
val2 = (k/2 > len2) ? INT_MAX : arr2[k/2-1];
if(val1 < val2) {
/* 肯定不在第一个数组的前k/2个元素内,因此将第一个数组中的前k/2去掉 */
return findKth(arr1+k/2, len1-k/2, arr2, len2, k-k/2);
}else {
/* 肯定不在第二个数组的前k/2个元素内,因此将第二个数组中的前k/2个元素去掉 */
return findKth(arr1, len1, arr2+k/2, len2-k/2, k-k/2);
}
}
double findMedianSortedArrays(int* nums1, int m, int* nums2, int n) {
int left = (m+n+1)/2, right = (m+n+2)/2;
return (findKth(nums1, m, nums2, n, left) + findKth(nums1, m, nums2, n, right))/2.0;
}
leetcode-4-寻找两个有序数组的中位数-C语言
最新推荐文章于 2021-09-29 23:20:03 发布