题目
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
Example 1:
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
我的思路
此题主要运用到合并排序中的思想。
想要求两个有序数组的中位数,可以考虑将这两个数组 nums1
和 nums2
合成一个有序数组 nums3
,这样通过求出 nums3
中间的索引,就可以得到 nums3
数组的中位数(此处注意区分 nums3
的长度为偶数和奇数时的情况即可),即可得到题目所要的结果。
而将这两个有序数组和合成一个有序数组的过程则可以引用合并排序中的思想了(MERGE 的过程)。
代码
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
int i = 0, j = 0, k = 0;
int nums3Size = nums1Size + nums2Size;
int* nums3 = (int*)malloc(nums3Size * sizeof(int));
int medianIdx = 0;
double median = 0.0;
// Merge nums1 and nums2 to nums3.
while((i < nums1Size) && (j < nums2Size)) {
if(*(nums1 + i) < *(nums2 + j)) {
*(nums3 + k) = *(nums1 + i);
i++;
k++;
}
else {
*(nums3 + k) = *(nums2 + j);
j++;
k++;
}
}
while(i < nums1Size) {
*(nums3 + k) = *(nums1 + i);
i++;
k++;
}
while(j < nums2Size) {
*(nums3 + k) = *(nums2 + j);
j++;
k++;
}
if(nums3Size % 2 == 0) {
medianIdx = nums3Size / 2;
median = ((double)*(nums3 + medianIdx - 1) + (double)*(nums3 + medianIdx)) / 2;
}
else {
medianIdx = nums3Size / 2;
median = *(nums3 + medianIdx);
}
free(nums3);
nums3 = NULL;
return median;
}