题目:
给定两个大小分别为 m
和 n
的正序(从小到大)数组 nums1
和 nums2
。请你找出并返回这两个正序数组的中位数 。
算法的时间复杂度应该为 O(log (m+n))
。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
示例 3:
输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000
示例 4:
输入:nums1 = [], nums2 = [1]
输出:1.00000
示例 5:
输入:nums1 = [2], nums2 = []
输出:2.00000
算法分析(递归):
考虑这样一个问题:在两个有序数组中找第
k
小的数
首先给出findKthNumber
的定义:从数组nums1[i:nums1.size() - 1]
和nums2[j:nums2.size() - 1]
中找到第k
小的数;为考虑方便,我们假定nums1.length - i<nums2.length - j
。
1.考虑一般情况:
在两个数组内找第k/2
小的元素,令si = i + k / 2, sj = j + 2 / k
判断:如果nums1[si - 1] >nums2[sj - 1]
,说明nums2[j:sj - 1]
中元素都是小于第k个元素,则去掉nums2[j:sj - 1]
的前k/2
个元素,在剩下区间去找第k-k/2
小的元素;
如果nums1[si - 1] <=nums2[sj - 1]
,说明nums2[i:si - 1]
中元素都是小于第k个元素,则去掉nums2[i:si - 1]
的前k/2
个元素,在剩下区间去找第k-k/2
小的元素;如果此时nums1[i:nums1.size() - 1]
内不足k/2个元素,则在nums2[j:nums2.size() - 1]
里找第k-(si - i)
小元素;由于这里不确定在nums1
内所找区间内的总元素个数是否大于等于k/2
,所里这里写为k-(si - i)
。
2.考虑特殊情况:
1.如果第一个数组是空的:则第k小元素为nums2[j+k-1];
2.如果k==1
:则返回两个数组最小的第一个元素
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
//判断找的中位数是哪一个,根据长度奇偶来分
int total = nums1.length + nums2.length;
if(total % 2 == 0) { //如果是偶数,则中位数为中间两数的平均数
int left = findKthNumber(nums1,0,nums2,0,total/2);
int right = findKthNumber(nums1,0,nums2,0,total/2+1);
return (left + right)/2.0;
}else{
return findKthNumber(nums1,0,nums2,0,total/2+1); //如果是奇数,则就返回中间这个数
}
}
int findKthNumber(int[] nums1,int i,int[] nums2,int j,int k){
//假定第一个数组长度小于等于第二个数组
if(nums1.length - i>nums2.length - j) return findKthNumber(nums2,j,nums1,i,k);
//处理边界问题:
//1.如果第一个数组是空的
if(nums1.length == i) return nums2[j+k-1]; //k=1: nums2[j]; k=2: nums2[j+1]
//2.如果找的是第一个数
if(k == 1) return Math.min(nums1[i],nums2[j]);
//考虑一般情况,在两段数组中找第k/2小元素
int si = Math.min(i + k/2,nums1.length);
int sj = j + k/2;
//说明第k个元素不在nums2的前k/2内
if(nums1[si - 1]>nums2[sj - 1]){
return findKthNumber(nums1,i,nums2,sj,k-k/2);
}else return findKthNumber(nums1,si,nums2,j,k-(si - i));
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。