zoukankan      html  css  js  c++  java
  • 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个数,此题k=(m+n)/2

    如果时间复杂度o(k)可以接受的话,可以模拟合并,找到第k个数即可

    此处要求时间复杂度O(log (m+n)).基本可以确定希望我们二分。

    二分一般有两个角度,一个是对结果二分,缩小结果范围,让其逼近结果;令一个是对容器二分,缩小可选范围。

    这题可以用第一个角度,找第k个数,那么我们每次排除k/2个数,时间复杂度就是O(logk).

    代码:

    int min(int a,int b)
    {
        return a<b?a:b;
    }
    
    int findKth(int a[],int m,int b[],int n,int k)
        {
            if(m>n){//假设m总是小于等于n
                return findKth(b,n,a,m,k);
            }
            if(m==0){
                return b[k-1];
            }
            if(n==0){
                return a[k-1];
            }
            if(k==1){
                return min(a[0],b[0]);
            }
            int pa = min(k/2,m);
            int pb = k-pa;
            if(a[pa-1] < b[pb-1]){
                return findKth(a+pa,m-pa,b,n,k-pa);
            }else if(a[pa-1] > b[pb-1]){
                return findKth(a,m,b+pb,n-pb,k-pb);
            }else{
                return a[pa-1];
            }
        }
    
    double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
        if((nums1Size+nums2Size)&0x1){
            return findKth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2+1);
        }else{
            int res1 = findKth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2);
            int res2 = findKth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2+1);
            return (res1+res2)/2.0;
        }
    }

    参考:http://blog.csdn.net/yutianzuijin/article/details/11499917/

  • 相关阅读:
    图解插入排序--直接插入排序
    在项目中代替DevExpress(一)
    java web servlet
    一元夺宝项目设计(上)
    一元夺宝项目设计(中)
    一元夺宝项目设计(下)
    ORM之四:调用入口与调用示例
    ORM之三:DbProvider与DbFactory
    ORM之二:核心接口与扩展操作
    ORM之一:适合我的ORM
  • 原文地址:https://www.cnblogs.com/zengzy/p/5013561.html
Copyright © 2011-2022 走看看