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)).
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]); //k=1时,只能是俩数组第一个中较小的
int partA = Integer.min(k / 2, m), partB = k - partA; //partA指前一数组所要拿出来比较的下标,partB指后一数组所要拿出来比较的下标
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;
}
}
}