栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

4、求两个数组的中位数

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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,返回。注意边缘条件的处理

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/699319.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号