给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2){
int len1 = nums1.length;
int len2 = nums2.length;
int totalLength = len1+len2;
double median = 0;
if (totalLength % 2 == 1) {
int midIndex = totalLength/2;
median =getKthElement(nums1,nums2,midIndex+1);
} else {
int midIndex1 = totalLength/2-1;
int midIndex2 = totalLength/2;
median = (getKthElement(nums1,nums2,midIndex1+1)+getKthElement(nums1,nums2,midIndex2+1))/2.0;
}
return median;
}
//k:第k大
public int getKthElement(int[] nums1, int[] nums2, int k) {
int len1 = nums1.length;
int len2 = nums2.length;
int index1 = 0;
int index2 = 0;
while (true) {
if (index1 == len1) {
return nums2[index2+k-1];
}
if (index2 == len2) {
return nums1[index1+k-1];
}
//第1大 && num1!=null && num2!=null
if (k == 1) {
return Math.min(nums1[index1],nums2[index2]);
}
int half = k / 2;
int newIndex1 = Math.min(index1 + half, len1) - 1;
int newIndex2 = Math.min(index2 + half, len2) - 1;
if (nums1[newIndex1] <= nums2[newIndex2]) {
k -= (newIndex1-index1+1);
index1 = newIndex1 + 1;
} else {
k -= (newIndex2-index2+1);
index2 = newIndex2 + 1;
}
}
}
}