• Median of Two Sorted Arrays


    1. Question

    找两个有序数组的中位数。时间复杂度O(log(m+n))

    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)).

    2. Solution

    2.1 O(nlogn)

    将两个数组拷到新数组中,对新数组排序

     1 public class Solution {
     2     public double findMedianSortedArrays( int[] a, int[] b ){
     3         int[] c = new int[a.length + b.length];
     4         System.arraycopy(a, 0, c, 0, a.length);
     5         System.arraycopy(b, 0, c, a.length, b.length);
     6         Arrays.sort(c);
     7         int mid = c.length / 2;
     8         if( c.length % 2 == 0 )
     9             return ( c[mid-1] + c[mid] ) / 2.0;
    10         return c[mid];
    11     }
    12 }
    sort

    2.2 O(n/2)---->O(n)

    将两个数组合并。

     1 public class Solution {
     2     public double findMedianSortedArrays( int[] a, int[] b ){
     3         int len1 = a.length;
     4         int len2 = b.length;
     5         int len = (len1 + len2) / 2 + 1;
     6         int[] c = new int[len];
     7         int ia;
     8         int ib;
     9         int ic;
    10         for( ia=0, ib=0, ic=0; ia<len1 && ib<len2 && ic<len; ic++ ){
    11             if( a[ia] <= b[ib] )
    12                 c[ic] = a[ia++];
    13             else
    14                 c[ic] = b[ib++];
    15         }
    16         for( ; ia<len1 && ic<len; ic++, ia++ )
    17             c[ic] = a[ia];
    18         for( ; ib<len2 && ic<len; ic++, ib++ )
    19             c[ic] = b[ib];    
    20         ic--;
    21         if( (len1 + len2) % 2 == 0 )
    22             return ( c[ic] + c[ic-1] ) / 2.0;
    23         return c[ic];
    24     }
    25 }
    merge

    2.3 O(logn)

    定义如下变量:

    • m1:nums1的中位数(有m/2个数小于等于m1)
    • m2:nums2的中位数(有n/2个数小于等于m2)

    判断m1和m2的大小,以舍弃一半的数组:

    • m1<m2:有(m+n)/2个数<=m2,即m1必然存在于合并后数组的前半部分,m2存在于后半部分。则中位数存在于nums1的后半部分或nums2的前半部分;
    • m1>m2:同上,中位数存在于nums1的前半部分或nums2的后半部分;
    • m1 == m2:m1即是中位数
     1 public class Solution {
     2     // find the kth big number;
     3     public int findKth( int[] a,  int afrom, int ato, int[] b, int bfrom, int bto, int k ){
     4         //we assume that m<=n
     5         int m = ato - afrom + 1;
     6         int n = bto - bfrom + 1;
     7         if( m > n )
     8             return findKth( b, bfrom, bto, a, afrom, ato, k);
     9         if( m == 0  )
    10             return b[k-1];
    11         if( k==1 )
    12             return ( a[afrom] < b[bfrom] ) ? a[afrom] : b[bfrom];
    13         int na = ( k/2 < m )? k/2 : m;
    14         int nb = k-na;
    15         int pa = na + afrom -1;
    16         int pb = nb + bfrom -1;
    17         if( a[pa] > b[pb] )
    18             return findKth( a, afrom, pa, b, pb+1, bto, k-nb );
    19         if( a[pa] < b[pb] )
    20             return findKth( a, pa+1, ato, b, bfrom, pb, k-na );
    21         return b[pb];
    22     }
    23     
    24     //O( log(m+n) ) time
    25     public double findMedianSortedArrays( int[] a, int[] b ){
    26         int len = a.length + b.length;
    27         if( len % 2 == 0 )
    28             return ( findKth( a, 0, a.length-1, b, 0, b.length-1,  len/2 ) + findKth( a, 0, a.length-1,  b, 0, b.length-1,  len/2+1 ) ) / 2.0;
    29         else 
    30             return findKth( a, 0, a.length-1, b, 0, b.length-1,  len/2+1 );
    31     }
    32 }
    binary
  • 相关阅读:
    mysql密码忘记如何恢复(windows/liunx版本:mysql8.0.27)
    Visual Studio Code如何校验yaml格式文件
    python测试小工具
    Lunx vimgo 开发环境搭建
    小白学正则表达式之 regexp
    kubernetes scc 故障排查小记
    Go image registry
    OpenShift image registry 概述
    Go 疑难杂症汇总
    小白学标准库之 http
  • 原文地址:https://www.cnblogs.com/hf-cherish/p/4571920.html
Copyright © 2020-2023  润新知