两个有序数组的中位数

来源:互联网 发布:知乎 一人之下漫画 编辑:程序博客网 时间:2024/06/05 03:13

1、两个相等长度的有序数组求上中位数

arr1=[1, 2, 3, 4],arr2= [3,4,5,6],上中位数为3

时间复杂度O(logN):

public int getUpMedian(int[] arr1 , int[] arr2){        int start1 =0;        int end1 = arr1.length-1;        int start2=0;        int end2 = arr2.length-1;        int mid1 =0;        int mid2 =0;        int offset = 0;        while(start1 < end1){            mid1 = (start1+end1)/2;            mid2 = (start2+end2)/2;            offset = ((end1 - start1+1)&1)^1; //分奇偶            if(arr1[mid1] > arr2[mid2]){                end1 = mid1;                start2=mid2+offset;            }else if(arr1[mid1]<arr2[mid2]){                start1 = mid1 + offset;                end2 = mid2;            }else {                return arr1[mid1];            }        }        return Math.min(arr1[start1], arr2[start2]);    }

2、两个有序数组求中位数(引申为第k小)

奇数为中间,偶数为中间两个数的一半。

(1)时间复杂度为log(m+n)

public double findMedianSortedArrays(int[] nums1, int[] nums2) {        int m = nums1.length, n = nums2.length;        int k = (m + n) / 2;        if((m+n)%2==0){            return (findKth(nums1,nums2,0,0,m,n,k)+findKth(nums1,nums2,0,0,m,n,k+1))/2;        }   else {            return findKth(nums1,nums2,0,0,m,n,k+1);        }            }        private double findKth(int[] arr1, int[] arr2, int start1, int start2, int len1, int len2, int k){        // 保证arr1是较短的数组        if(len1>len2){            return findKth(arr2,arr1,start2,start1,len2,len1,k);        }        if(len1==0){            return arr2[start2 + k - 1];        }        if(k==1){            return Math.min(arr1[start1],arr2[start2]);        }        int p1 = Math.min(k/2,len1) ; //精华所在        int p2 = k - p1;        if(arr1[start1 + p1-1]<arr2[start2 + p2-1]){            return findKth(arr1,arr2,start1 + p1,start2,len1-p1,len2,k-p1);        } else if(arr1[start1 + p1-1]>arr2[start2 + p2-1]){            return findKth(arr1,arr2,start1,start2 + p2,len1,len2-p2,k-p2);        } else {            return arr1[start1 + p1-1];        }    }

(2)时间复杂度log(min(M,N))

参考左神的书《程序员代码面试指南》P468

参考:https://segmentfault.com/a/1190000002988010

https://leetcode.com/problems/median-of-two-sorted-arrays/description/