LeetCode解题 4:Median of Two Sorted Arrays
Problem 4: Median of Two Sorted Arrays [Hard]
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)).
You may assume nums1 and nums2 cannot be both empty.
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
来源:LeetCode
解题思路
中位数可以转化为寻找一个数组中的第K小的数或是第K小和第K+1小的数的平均值。
如下图数组1长度为4,数组2长度为10,则中位数为第7小和第8小数之和除以2。
考虑获取第7小数的情况:比较两个数组第k/2小数(即第3小数)的值,更小的一方可以直接去掉3个数(1,2,3),剩下的数(1,3,4,9,4,5,6,7,8,9,10)可以递归寻找第4(7-3=4)小数。
图源:LeetCode题解
每一轮递归可去掉k/2个数,因此时间复杂度为O(log k),而k=(m+n)/2,因此可保证题目要求复杂度O(log (m+n))。
要点:递归
、二分法
Solution (Java)
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
if((m+n)%2 == 1){
return findKnum(nums1, 0, m-1, nums2, 0, n-1, (m+n)/2+1);
}
else{
return (findKnum(nums1, 0, m-1, nums2, 0, n-1, (m+n)/2) + findKnum(nums1, 0, m-1, nums2, 0, n-1, (m+n)/2+1))/2;
}
}
private double findKnum(int[] nums1, int l1, int r1, int[] nums2, int l2, int r2, int k) {
int len1 = r1 - l1 + 1;
int len2 = r2 - l2 + 1;
if(len1 > len2) return findKnum(nums2, l2, r2, nums1, l1, r1, k);
if(len1 == 0) return nums2[l2 + k-1];
if(k == 1) return Math.min(nums1[l1], nums2[l2]);
int index1 = Math.min(r1, l1 + k/2-1);
int index2 = l2 + k/2-1;
if(nums1[index1] < nums2[index2]){
k = k - (index1 - l1 + 1);
return findKnum(nums1, index1+1, r1, nums2, l2, r2, k);
}
else{
k = k - (index2 - l2 + 1);
return findKnum(nums1, l1, r1, nums2, index2+1, r2, k);
}
}
}
修改过程
- 考虑len1>len2的情况下调换数组顺序,便于后续保证只有数组1才有个数为0或个数小于k/2的情况。