题目描述:
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)).
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这个题就是找第K小的值得问题.
n1=nums1.length,n2=nums2.length。
如果n1+n2为奇数,则取第(n1+n2)/2+1小的值
如果n1+n2为偶数,则取第(n1+n2)/2+1小和第(n1+n2)/2小的值,然后两者相加除以2
这里一个重要的关系是若nums1[k/2]<nums2[k/2],那么nums1[0]~nums1[k/2]肯定在总的第k小数的组里。
代码如下:
public class Solution {
public static int findKthSmallest(int[] a, int m, int begin1, int[] b, int n, int begin2, int k) {
if (m > n)
return findKthSmallest(b, n, begin2, a, m, begin1, k);
if (m == 0)
return b[begin2 + k - 1];
if (k == 1)
return Integer.min(a[begin1], b[begin2]);
int partA = Integer.min(k / 2, m), partB = k - partA;
if (a[begin1 + partA - 1] == b[begin2 + partB - 1])
return a[begin1 + partA - 1];
else if (a[begin1 + partA - 1] > b[begin2 + partB - 1])
return findKthSmallest(a, m, begin1, b, n - partB, begin2 + partB, k - partB);
else
return findKthSmallest(a, m - partA, begin1 + partA, b, n, begin2, k - partA);
}
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len1 = nums1.length, len2 = nums2.length, sumLen = len1 + len2;
if (sumLen % 2 != 0) {
return findKthSmallest(nums1, len1, 0, nums2, len2, 0, sumLen / 2 + 1);
} else {
return (findKthSmallest(nums1, len1, 0, nums2, len2, 0, sumLen / 2)
+ findKthSmallest(nums1, len1, 0, nums2, len2, 0, sumLen / 2 + 1)) / 2.0;
}
}
}