题目来源
给定两个有序数组,求其中位数,这道题之前做过,而且在微软面试的时候还面过。知道大概是利用二分的方法来做的,但是写代码就是写不出来。
然后就看了下讨论区的大神做法,大神们把两个数组都填充下,N个元素的数组变成2N+1长度。例如1 2 3
变成# 1 # 2 # 3 #
。
然后这样的话不管数组是奇数还是偶数长度处理起来就都一样了。
代码非常简单,如下,主要是维持两个mid,使得两个mid左边的数目和右边的数目一样,然后主要看mid2,就是比较短的那个串,另一个的话直接n1+n2-mid2
就可以了。
然后就是l1, l2, r1, r2
的维持,需要判断一下l是否是为0以及r是否是最末尾。
注意结果应该是double类型。
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int n1 = nums1.size(), n2 = nums2.size();
if (n1 < n2)
return findMedianSortedArrays(nums2, nums1);
int lo = 0, hi = 2 * n2;
while (lo <= hi) {
int mid2 = (lo + hi) / 2;
int mid1 = n1 + n2 - mid2;
int l1 = (mid1 == 0) ? INT_MIN : nums[(mid1 - 1) / 2];
int l2 = (mid2 == 0) ? INT_MIN : nums[(mid2 - 1) / 2];
int r1 = (mid1 == n1 * 2) ? INT_MAX : nums[mid1 / 2];
int r2 = (mid2 == n2 * 2) ? INT_MAX : nums[mid2 / 2];
if (l1 > r2)
lo = mid1 + 1;
else if (l2 > r1)
hi = mid1 - 1;
else
return (max(l1, l2) + min(r1, r2)) / 2;
}
return -1;
}
};