leetcode 4. Median of Two Sorted Arrays
题目
就是找两个有序list的中间值
其实就是两个list 合一就可以了
题目给我们一个list, 我们可以往后移动一下 这样[0]位置的元素代表INT_MIN, 然后中间是 [1, len(list)] 这个是当前的list, 然后 > len(list) 就是INT_MAX
这样我们就可以表示出来
num1 num2
num3 num4
我们要保证中间值是 num1和num3的较大者, 由于num1 <= num2 && num3 <= num4
我们仅仅需要保证 num1<=num4 && num3 <= num2就可以得到最后的中间值
所以二分check一下就可以了
题解
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int k1 = nums1.size(), k2 = nums2.size();
if(k1 < k2)
return findMedianSortedArrays(nums2, nums1);
int K = k1 + k2;
int MED = (K+1)/2;
int l = 0, r = k1;
int n1, n2, n3, n4;
while(l <= r) {
int m1 = (l+r)/2;
int m2 = MED - m1;
n1 = (m1 <= 0) ? INT_MIN : (m1 > k1) ? INT_MAX : nums1[m1-1];
n2 = (m1+1 <= 0) ? INT_MIN : (m1+1 > k1) ? INT_MAX : nums1[m1];
n3 = (m2 <= 0) ? INT_MIN : (m2 > k2) ? INT_MAX : nums2[m2-1];
n4 = (m2+1 <= 0) ? INT_MIN : (m2+1 > k2) ? INT_MAX : nums2[m2];
if(n1 <= n4 && n3 <= n2)
break;
else if(n1 > n4)
r = m1 - 1;
else
l = m1 + 1;
}
if (K & 1) {
return max(n1, n3);
} else {
return 1.0 * (max(n1, n3) + min(n2, n4)) / 2;
}
}
};