题目链接:Median of Two Sorted Arrays
题目原文:
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)).
You may assume nums1 and nums2 cannot be both empty.
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
( • ̀ω•́ )✧这是一道红色的hard题,不过不虚…
题目的意思是给你两个从小到大排好序的数组nums1和nums2,要求从中找出二者的中位数。一看到中位数,菜鸡如我只能想起分治(今天打比赛一个非常简单的签到题被我想复杂了,列了好多情况分治还RE结果dalao一个公式AC
(〃´-ω・) 以后窝还是应该想简单一点…)。回到正轨,二分法在这道题里是一个正确的思路。但是这里两个数组,要怎样分才能找到共同的中位数呢?当然如果时间没有限制可以合并成一个数组排序直接输出,但是你看了看你手上的内排时间复杂度:算啦,二分就二分吧。
核心是对二者的中位数进行比较决定返回哪一个.
int nums1_len;
int nums2_len;
int findKthSortedArrays(int * nums1, int candi1, int* nums2, int candi2, int k) {
int len1, len2;
int med1, med2;
if (candi1 >= nums1_len) return nums2[candi2 + k - 1];
if (candi2 >= nums2_len) return nums1[candi1 + k - 1];
if (k == 1) return nums1[candi1] < nums2[candi2] ? nums1[candi1] : nums2[candi2];
med1 = (candi1 + k / 2 <= nums1_len) ? nums1[candi1 + k / 2 - 1] : INT_MAX;
med2 = (candi2 + k / 2 <= nums2_len) ? nums2[candi2 + k / 2 - 1] : INT_MAX;
return (med1 < med2) ? findKthSortedArrays(nums1, candi1 + k / 2, nums2, candi2, k - k / 2) : findKthSortedArrays(nums1, candi1, nums2, candi2 + k / 2, k - k / 2);
}
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
int med1, med2;
double ans1, ans2;
double ans;
nums1_len = nums1Size;
nums2_len = nums2Size;
med1 = (nums1Size + nums2Size + 1) / 2;
med2 = (nums1Size + nums2Size + 2) / 2;
ans1 = findKthSortedArrays(nums1, 0 ,nums2, 0,med1);
ans2 = findKthSortedArrays(nums1, 0, nums2, 0, med2);
ans = (ans1 + ans2) / 2.0;
return ans;
}