两个排序数组的中位数(归并)

给定两个大小为 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;
    }

 

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