zoukankan      html  css  js  c++  java
  • LeetCode题解-----Median of Two Sorted Arrays

    题目描述:

    There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

    解题思路:

      本题要求求解的是两个有序序列的中位数。本质上就是求两个有序序列“第k小的数“的变形。假设两个有序序列一个长为m,另一个长为n,则我们要求的就是第(m+n)/2+1个数,若m+n为偶数,则求的是第(m+n)/2和第(m+n)/2+1个数的平均数。

      接下来分析如何在O(log(m+n))的复杂度内求解第k个小的数。我们首先假设k为偶数并且两个有序序列a,b的长度都大于k/2(边界情况见代码),比较a[k/2-1]和b[k/2-1]的大小:

    1)若a[k/2-1]==b[k/2-1],则该值就是我们所要求的值,因为将a和b的前k/2个元素归并后就获得了a,b序列的前k个元素,并且a[k/2-1]和b[k/2-1]相等且在最末尾。

    2)若a[k/2-1]<b[k/2-1],则a的前k/2个元素中并不包含我们所求的第k小的元素,因此我们可以将其舍弃,进而递归求解剩下这些元素的第(k-k/2)小的元素。

    3)若a[k/2-1]>b[k/2-1],处理方法和情况2类似

    复杂度分析:

    我们在求解第k小的元素的每次递归的过程中,基本上每次都要舍弃接近k/2的元素,而k的初始值为(m+n)/2,因为算法的复杂度为O(log(m+n))

    代码:

    int findkth(int* a,int aSize,int*b,int bSize,int k) {
        int aPos,bPos;
        if(aSize>bSize){//保证a始终是较短序列
            return findkth(b,bSize,a,aSize,k);
        }
        if(aSize==0){//如果序列a空了,则直接返回
            return b[k-1];
        }
        if(k==1){
            return a[0]<b[0] ? a[0] : b[0];
        }
        
        aPos = k/2<aSize ? k/2 : aSize;//如果a太短,则直接取a的末尾元素比较
        bPos = k-aPos;
        
        if(a[aPos-1]==b[bPos-1]){
            return a[aPos-1];
        }else if(a[aPos-1]<b[bPos-1]){
            return findkth(a+aPos,aSize-aPos,b,bSize,k-aPos);
        }else{
            return findkth(a,aSize,b+bPos,bSize-bPos,k-bPos);
        }
        
    }
    
    double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
        
        if((nums1Size+nums2Size)%2){
            return findkth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2+1)*1.0;
        }else{
            return (findkth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2)
                +findkth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2+1))/2.0;
        }
    }
    

      

  • 相关阅读:
    转载 --ios 模型-setValuesForKeysWithDictionary
    转载 ----HTML5 ---js实现json方式提交数据到服务端
    转载 项目经理需要修炼的9件事
    转载 人生,没有那么简单
    HTML5 ---localStorage储存实例
    HTML5 ---localStorage
    HTML5 --照抄书里的代码但函数无法执行、求分析( Uncaught ReferenceError: xxx is not defined)
    html5 -js判断undefined类型
    python-打印简单公司员工信息表
    python练习程序_员工信息表_基本实例
  • 原文地址:https://www.cnblogs.com/YaoDD/p/5205554.html
Copyright © 2011-2022 走看看