分析:
- 对于两个有序序列, 要求log(n+m) 求出, 那么就优先二分, 其次由于有单调性,所以再次确认是二分。
- 对于两个有序序列, 如何一次能用二分来排除一部分的数, 我们就可以轻而易举 的想到 如果都取中值, 那么就可以更新二分中点, 并且删除 某个log 个数的数。
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int tot = nums1.size() + nums2.size();
if(tot %2 == 0)
{
int first = findKthNumber(nums1, 0, nums2, 0, tot/2);
int second = findKthNumber(nums1, 0, nums2, 0, tot/2+1);
return (first + second) / 2.0;
}
else
{
return findKthNumber(nums1, 0, nums2, 0, tot/2+1);
}
}
int findKthNumber(vector<int> &nums1, int i, vector<int> &nums2, int j, int k)
{
if(nums1.size() - i > nums2.size() - j) return findKthNumber(nums2, j, nums1, i, k);
if(nums1.size() == i) return nums2[j+k-1];
if(k == 1) return min(nums1[i], nums2[j]);
int si = min(i+k/2, int(nums1.size())) , sj = j+k/2;
if(nums1[si-1] > nums2[sj - 1])
{
return findKthNumber(nums1, i, nums2, j+k/2, k-k/2);
}
else
{
return findKthNumber(nums1, si, nums2, j, k-(si-i));
}
}
};