给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
输入:两个有序数组
输出:浮点数double
思路:
好难,等二刷
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int length1 = nums1.length;
int length2 = nums2.length;
int totalLength = length1 + length2;
//判断长度的奇偶性
if(totalLength % 2 == 1){
//奇
int midIndex = totalLength / 2;
double median = getKthElement(nums1, nums2, midIndex + 1);
return median;
}else{
//偶
int midIndex1 = totalLength / 2 - 1;
int midIndex2 = totalLength / 2;
double median = (getKthElement(nums1, nums2, midIndex1 + 1)
+ getKthElement(nums1, nums2, midIndex2 + 1)) / 2.0;
return median;
}
}
public int getKthElement(int[] nums1, int[] nums2, int k){
//nums1和nums2的长度
int length1 = nums1.length;
int length2 = nums2.length;
//开始索引
int index1 = 0;
int index2 = 0;
//进入循环
while(true){
//边界
if(index1 == length1){
//返回nums2,此时的k是修改后的k
return nums2[index2 + k - 1];
}
if(index2 == length2){
return nums1[index1 + k - 1];
}
if(k == 1){
return Math.min(nums1[index1], nums2[index2]);
}
//正常情况
int half = k / 2;
//然后更新新的索引
int newIndex1 = Math.min(index1 + half, length1) - 1;
int newIndex2 = Math.min(index2 + half, length2) - 1;
//然后比较这两个值
if(nums1[newIndex1] <= nums2[newIndex2]){
//弃掉nums左边的值
//更新k
k -= (newIndex1 - index1 + 1);
//更新index1
index1 = newIndex1 + 1;
}else{
k -= (newIndex2 - index2 + 1);
index2 = newIndex2 + 1;
}
}
}
}