题目描述
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
题目大意
给出两个排好序的数组,找出它们的中值。
思路分析
这是一道经典的分而治之的题目,将两个有序数组分成两半,找出数值小的部分的最大值和数值大的部分的最小值,中值就等于他们的平均数((m+n)为偶数时),或者其中之一((m+n)为奇数)。时间复杂度为O(log n),空间复杂度为O(1)。
关键代码
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size();
int n = nums2.size();
if (m < n) { // ensure that m >= n
vector<int> temp = nums1;
nums1 = nums2;
nums2 = temp;
m = nums1.size();
n = nums2.size();
}
int low = 0, high = n, half = (m+n+1)/2;
while (low <= high) { // divide in two part
int med1 = (low+high)/2;
int med2 = half-med1;
if (med1 < high && nums1[med2-1] > nums2[med1]) { // median in the right part
low = med1 + 1;
} else if (med1 > low && nums2[med1-1] > nums1[med2]) { // median in the left part
high = med1 - 1;
} else {
// max of left part
int maxLeft = 0;
if (med1 == 0) maxLeft = nums1[med2-1];
else if (med2 == 0) maxLeft = nums2[med1-1];
else maxLeft = (nums2[med1-1] > nums1[med2-1]) ? nums2[med1-1] : nums1[med2-1];
if ((m+n)%2 == 1) return maxLeft;
// min of the right part
int minRight = 0;
if (med1 == n) minRight = nums1[med2];
else if (med2 == m) minRight = nums2[med1];
else minRight = (nums1[med2] > nums2[med1]) ? nums2[med1] : nums1[med2];
return (maxLeft + minRight)/2.0;
}
}
return 0;
}
总结
这道题给我们提供了分而治之的思想,在查找两部分的最大(小)值时采用二分法,加快了算法的速度。而在处理m+n为奇偶数的时候需要小心。
采用合并再查找也可以,时间复杂度变为O(m+n),但是这就没有用到分而治之的思想了。