兩個排序數組的中位數(歸併)

給定兩個大小爲 m 和 n 的有序數組 nums1 和 nums2 。

請找出這兩個有序數組的中位數。要求算法的時間複雜度爲 O(log (m+n)) 。

你可以假設 nums1 和 nums2 不同時爲空。

示例 1:

nums1 = [1, 3]
nums2 = [2]

中位數是 2.0
示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

中位數是 (2 + 3)/2 = 2.5

思路:由條件可知 1.數組有序 2.數組不全爲空 3.條件O(m+n)

可以用歸併 

 public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
        if (nums1.length == 0) {
            if (nums2.length % 2 == 0) {
                return (nums2[nums2.length / 2] + nums2[nums2.length / 2 - 1]) / 2.0;
            }
            return nums2[nums2.length / 2];
        }
        if (nums2.length == 0) {
            if (nums1.length % 2 == 0) {
                return (nums1[nums1.length / 2] + nums1[nums1.length / 2 - 1]) / 2.0;
            }
            return nums1[nums1.length / 2];
        }
        int sum = nums1.length + nums2.length;
        int mid = sum / 2;
        int[] tmp = new int[mid + 1];
        int i = 0, j = 0, index = 0;
        while (i + j <= mid) {
            if (nums1[i] > nums2[j]) {
                tmp[index] = nums2[j];
                if (j + 1 < nums2.length) {
                    ++j;
                } else {
                    nums2[j] = Integer.MAX_VALUE;
                }
            } else {
                tmp[index] = nums1[i];
                if (i + 1 < nums1.length) {
                    ++i;
                } else {
                    nums1[i] = Integer.MAX_VALUE;
                }
            }
            ++index;
            if (index == mid + 1) {
                break;
            }
        }
        if (sum % 2 != 0)
            return tmp[mid];
        else
            return (tmp[mid - 1] + tmp[mid]) / 2.0;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章