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

题目:

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

      合并两个数组,排序,然后寻找中位数,很简单很自然的思路;

算法:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        nums1.insert(nums1.end(),nums2.begin(),nums2.end());
        sort(nums1.begin(),nums1.end());
        if(nums1.size()%2==0){
            return (double)(nums1[nums1.size()/2-1]+nums1[nums1.size()/2])/2;
        }
        else
            return (double)(nums1[nums1.size()/2]);
    }
};

运行结果:

   

执行用时:12 ms, 在所有 C++ 提交中击败了99.27%的用户 内存消耗:87.2 MB, 在所有 C++ 提交中击败了29.01%的用户 通过测试用例:2094 / 2094   方法二:双指针法 思路:            我并不需要合并数组,只需要找到(m+n)/2这个数,为奇数的话,便直接为偶数。值为偶数的话,还需要找到(m+n)/2+1,去平均值即为中位数。 算法:         
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n1=0;// nuns1指针
        int n2=0; //  nums2指针
        int m=nums1.size();
        int n=nums2.size();
        double mid=0;//   存储最终值
        for(int i=0;i<(m+n)/2;i++){  //寻找第(m+n)/2个数
               if((n1)<m&&(n2<n)) //防止数组越界
               mid=(nums1[n1]<=nums2[n2])?nums1[n1++]:nums2[n2++];
               else if(n1==m)
               mid=nums2[n2++];
               else
               mid=nums1[n1++];
        }
        //判断总数,计算中位数;
        if((n+m)%2==0){   //若为偶数,还需计算找出下个数,并与mid计算中位数;
             /*if(nums1[n1]<=nums2[n2]) return (mid+nums1[n1])/2;
             else return (mid+nums2[n2])/2;*/
             if(n1==m) 
                return (mid+nums2[n2])/2;
             else if(n2==n)  
                return (mid+nums1[n1])/2;
             else
                return (nums1[n1]<=nums2[n2])?(mid+nums1[n1])/2:(mid+nums2[n2])/2;
        }
        //为奇数个,中位值直接为第(m+m)/2+1个数;
        else  {
            /*
            if(nums1[n1]<=nums2[n2]) return nums1[n1];
            else return nums2[n2];*/
             if(n1==m) 
                return nums2[n2];
             else if(n2==n)  
                return nums1[n1];
             else
                return (nums1[n1]<=nums2[n2])?nums1[n1]:nums2[n2];
        }
        return 0;  
    }
};

程序做出了很多判断,主要是防止数组越界,对部分判断语句做了优化改为三目运算符 ? :  但是依旧有很多判断,好处是没有运用库,用基本的运算符实现了算法,切仅有一个循环。时间复杂度为(m+n)/2

执行用时:32 ms, 在所有 C++ 提交中击败了43.51%的用户  //  多次运行时间变化很大,不作参考 内存消耗:86.8 MB, 在所有 C++ 提交中击败了76.96%的用户 通过测试用例:2094 / 2094
上一篇:SAML 2.0 的 SSO(Single Sign On,单点登录)


下一篇:33.第九章 磁盘存储和文件系统管理(三)