There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
You may assume nums1 and nums2 cannot be both empty.
Example 1:
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
tag: binary search, array, Divide and Conquer
method 1
算法的思想是使用getKth(),即得到第k大的数.用k表示两个数组中第k大的数,可能不好理解的就是为什么是k/2,这里应用了二分查找思想,aStart+k/2-1即是第k大的数中左边的中间值,bStart+k/2-1即是第k大的数中右边的数中的中间值,如果左边的中间值小于右边的中间值,证明左边的指针应该往右移动,而新起点自然就是这个左边的中间值,所以是aStart+k/2.因为少了k/2个数,所以新第k大的数就是k-k/2
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length, n = nums2.length;
int l = (m + n + 1) / 2;
int r = (m + n + 2) / 2;
return (getKth(nums1, 0, nums2, 0, l) + getKth(nums1, 0, nums2, 0, r)) / 2.0;
}
private double getKth(int[] nums1, int aStart, int[] nums2, int bStart, int k) {
if (aStart > nums1.length - 1) return nums2[bStart + k - 1];
if (bStart > nums2.length - 1) return nums1[aStart + k - 1];
if (k == 1) return Math.min(nums1[aStart], nums2[bStart]);
int aMid = Integer.MAX_VALUE, bMid = Integer.MAX_VALUE;
if (aStart + k/2 - 1 < nums1.length) aMid = nums1[aStart + k/2 - 1];
if (bStart + k/2 - 1 < nums2.length) bMid = nums2[bStart + k/2 - 1];
if (aMid < bMid)
return getKth(nums1, aStart + k/2, nums2, bStart, k-k/2);
else return getKth(nums1, aStart,nums2,bStart+k/2,k-k/2);
}
summary:
- 在有序数组中查找某个值,自然想到二分查找,二分查找的推进是在两个中间值间推荐.现在突然看似乎很顺其自然的感觉?没什么可总结的...