Median of Two Sorted Arrays(hard)

题目要求:

有两个排序的数组nums1nums2分别为m和n大小。

找到两个排序数组的中位数。整体运行时间复杂度应为O(log(m + n))。

示例:

我的方法:

  分别逐个读取两个数组的数,放到一个新的数组里,由于两个数组本身是已经排序好的,所以只需要在放在新数组时候注意对比,放入完成后,就是一个排序好的数组了,就不需要重新排序增加时间复杂度。然后再找出中位数。

public static double getMediumNum(int[] nums1, int[] nums2){
        int m = nums1.length;
        int n = nums2.length;
        int l = n + m;
        int[] nums = new int[l];
        int i=0, j=0, t=0;
        for(; t<l && (i<m) && (j<n); t++){
            if(nums1[i] < nums2[j]){
                nums[t] = nums1[i];
                i++;
            }else{
                nums[t] = nums2[j];
                j++;
            }
        }
        if(i == m && t != l){
            for(;t<l;t++,j++){
                nums[t] = nums2[j];
            }
        }else if(j == n && t != l){
            for(;t<l;t++,i++){
                nums[t] = nums1[i];
            }
        } 
        for(int a=0; a<nums.length; a++){
            System.out.println(nums[a]);
        }
        if(l%2 == 0){
            return ((double)nums[l/2] + (double)nums[l/2-1])/2;
        }
        return (double)nums[l/2];
    }

leetcode方法:

 public double findMedianSortedArrays(int[] A, int[] B) {
        int m = A.length;
        int n = B.length;
        if (m > n) { // to ensure m<=n
            int[] temp = A; A = B; B = temp;
            int tmp = m; m = n; n = tmp;
        }
        int iMin = 0, iMax = m, halfLen = (m + n + 1) / 2;
        while (iMin <= iMax) {
            int i = (iMin + iMax) / 2;
            int j = halfLen - i;
            if (i < iMax && B[j-1] > A[i]){
                iMin = iMin + 1; // i is too small
            }
            else if (i > iMin && A[i-1] > B[j]) {
                iMax = iMax - 1; // i is too big
            }
            else { // i is perfect
                int maxLeft = 0;
                if (i == 0) { maxLeft = B[j-1]; }
                else if (j == 0) { maxLeft = A[i-1]; }
                else { maxLeft = Math.max(A[i-1], B[j-1]); }
                if ( (m + n) % 2 == 1 ) { return maxLeft; }

                int minRight = 0;
                if (i == m) { minRight = B[j]; }
                else if (j == n) { minRight = A[i]; }
                else { minRight = Math.min(B[j], A[i]); }

                return (maxLeft + minRight) / 2.0;
            }
        }
        return 0.0;
    }
posted @ 2017-10-19 23:13  K_artorias  阅读(426)  评论(2编辑  收藏  举报