4、求两个数组的中位数

4、求两个数组的中位数,第1张

4、求两个数组中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

class Solution {
public:
    double findMedianSortedArrays(vector& nums1, vector& nums2) {
         int m = nums1.size(), n = nums2.size(), left = (m + n + 1) / 2, right = (m + n + 2)/2;
         return (findKeyValue(nums1, 0, nums2, 0, left) + findKeyValue(nums1, 0, nums2, 0, right)) / 2.0; 
    }
    int findKeyValue( vector &nums1, int i, vector & nums2, int j, int k) {
        if(i >= nums1.size()) return nums2[j + k - 1];
        if(j >= nums2.size()) return nums1[i + k - 1];
        if (k == 1) return min(nums1[i], nums2[j]);

        int midValue1 = ((i + k/2 -1) < nums1.size()) ? nums1[i + k/2 - 1]:INT_MAX;
        int midValue2 = ((j + k/2 -1) < nums2.size()) ? nums2[j + k/2 - 1]:INT_MAX;
        if (midValue1 < midValue2) {
            return findKeyValue(nums1, i + k /2, nums2, j,k - k/2);
        } else {
            return findKeyValue(nums1, i, nums2, j + k/2, k - k/2);
        }
    }
};

以下注意点:
1、findMedianSortedArrays函数return值需要除以2.0,而不是2.自己第一次在这里写错导致结果错误,会先转换为int,再转double。
2、寻找中位数方法:两个有序数组的长度分别为m和n,分别找(m+n+1)/2和(m+n+2)/2个,然后求平均值即可,这对奇偶都使用。若m+n为奇数的话,那么其实(m+n+1)/2和(m+n+2)/2的值相等,详单与两个相同的数字相加再除以2,还是其本身
3、对K进行二分,直到K = 1,返回。注意边缘条件的处理

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5699445.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存