兩個排序陣列的中位數(歸併)
阿新 • • 發佈:2018-11-03
給定兩個大小為 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; }