4. 两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
示例 1:
nums1 = [1, 3] nums2 = [2] 中位数是 2.0
示例 2:
nums1 = [1, 2] nums2 = [3, 4] 中位数是 (2 + 3)/2 = 2.5
int compare(int* nums1,int* nums2,int i,int j){
if(nums1[i] >= nums2[j])
return 1;
return 0;
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
double ans = 0;
int p = 0,q = 0;
int flag = (nums1Size + nums2Size + 1)/2;
int flag1 = ((nums1Size + nums2Size) % 2 == 0) ? 2 : 1;
int num = flag1;
int count = 0;
while(count < flag + 1){
int temp = 0;
if(p < nums1Size && q < nums2Size){
if(compare(nums1,nums2,p,q) == 1)
temp = nums2[q++];
else
temp = nums1[p++];
}
else if(p < nums1Size)
temp = nums1[p++];
else if(q < nums2Size)
temp = nums2[q++];
count++;
if(flag <= count && flag1 > 0){
flag1--;
ans += temp;
}
}
return (ans/num);
}
这题的主要解题思路是通过双指针的方法进行的,首先通过判断该中位数为一个数还是两个数的平均值flag1 = ((nums1Size + nums2Size) % 2 == 0) ? 2 : 1;然后通过计数的方法依此的移动指针,直到移到中位数的位置然后获取值。时间复杂度为O(n + m)如果要进一步减小时间复杂度,可以考虑用二分查找的方法。