给出两个有序数组,在时间复杂度\(O(log(m + n))\)内求出这两个数组的中位数。
王道数据结构上做过,感觉是比每章给出的思维拓展题都要好的一道题目。与那道题不同的是,这道题两组数据给出的元素个数是可以不一样的。二分查找来实现。具体操作如下:
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
if(nums1.size() > nums2.size())
return findMedianSortedArrays(nums2, nums1);
int m = nums1.size();
int n = nums2.size();
int low = 0, high = m;
while(low <= high)
{
int i = low + high >> 1;
int j = (m + n + 1) / 2 - i;
int maxleftA = i == 0 ? INT_MIN : nums1[i - 1];
int minrightA = i == m ? INT_MAX : nums1[i];
int maxleftB = j == 0 ? INT_MIN : nums2[j - 1];
int minrightB = j == n ? INT_MAX : nums2[j];
if(maxleftA <= minrightB && maxleftB <= minrightA)
{
if((m + n) & 1)
return 1.0 * max(maxleftA, maxleftB);
else
return (max(maxleftA, maxleftB) + min(minrightA, minrightB)) / 2.0;
}
else if(maxleftA > minrightB)
high = i - 1;
else
low = i + 1;
}
return 0.0;
}
};
一直觉得有好多细节要考虑,于是迟迟没动键盘(难道这就是你咕了一年的原因?)。
原文:https://www.cnblogs.com/songjy11611/p/12109478.html