LeetCode #4 寻找两个有序数组的中位数

传送门

题意: 给定两个有序数组, 求中位数

思路: 中位数实际上就是找中间那最多两个数, 然后两个数组又是有序的, 所以可以转换成求两个有序数组合并后的第k大问题, 所以我们需要有一个函数求 对于两个有序数组求第k大, 那么如何最快的求第k大了,很明显我们在两个数组中同时各取一半的数字(k/2) , 如果第一个数组的这位置(起始位+k/2-1)的数字比第二个的小, 那么说明这第k大肯定是不在第一个数组的这段范围内(start + k / 2 - 1), 所以我们可以直接扔掉, 也就是每一次我们都可以减少k / 2, 也就是log的复杂度, 所以总复杂度就是log(m + n), 所以一些边界情况的处理, 比如第二数组比第一个数组长很多等等.(其实代码都考虑到了的)

AC Code

double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
    int l = (nums1.size() + nums2.size()) / 2 + 1;
    int r = ((nums1.size() + nums2.size()) & 1) ? l : l - 1 ;
    return (getKthNum(nums1, 0, nums2, 0, l) + getKthNum(nums1, 0, nums2, 0, r)) / 2;
}
double getKthNum(vector<int>&nums1, int sa, vector<int>&nums2, int sb, int k) {
    if (sa >= nums1.size()) return nums2[sb + k - 1];
    if (sb >= nums2.size()) return nums1[sa + k - 1];
    if (k == 1) return min(nums1[sa], nums2[sb]);
    
    int l = INT_MAX, r = INT_MAX;
    if (sa + k / 2 - 1 < nums1.size()) l = nums1[sa + k/2 - 1];
    if (sb + k / 2 - 1 < nums2.size()) r = nums2[sb + k/2 - 1];
    return l < r ? getKthNum(nums1, sa + k / 2, nums2, sb, k - k / 2) : getKthNum(nums1, sa, nums2, sb + k / 2, k - k / 2);
}

你可能感兴趣的:(leetcode,部分题解)