给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
你可以假设 nums1 和 nums2 均不为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
中位数是 (2 + 3)/2 = 2.5
解题思路:实现一个函数,找到两个有序数组的第K个元素
找到两个有序数组的第K个元素:
a数组分为【A1={a0...a(an-2)}】,【a(an-1)】,【A2={a(an)...}】
b数组分为【B1={b0...b(bn-2)}】,【b(bn-1)】,【B2={b(bn)...}】
始终保持A1,a(an-1),b(bn-1),B1个数为k
若a(an-1)==b(bn-1),A1B1<{a(an-1),b(bn-1)},则第K个元素是a(an-1)/b(bn-1);
若a(an-1)>b(bn-1),则an应该左移,可排除a(an-1)和A2,由于始终保持A1,a(an-1),b(bn-1),B1个数为k,相当于bn右移,即在a数组和B2中搜索第k-bn个元素;
若a(an-1)<b(bn-1),则an右移,即在A2和b数组中搜索第k-an个元素
java代码:
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int k = nums1.length + nums2.length;
if(0 != (k & 1)){
return findK(nums1, 0, nums2, 0, k/2+1);
} else {
return (findK(nums1, 0, nums2, 0, k/2) + findK(nums1, 0, nums2, 0, k/2+1))/2.0;
}
}
private int findK(int[] nums1, int s1, int[] nums2, int s2, int k){
if(nums1.length - s1 > nums2.length - s2) {
return findK(nums2, s2, nums1, s1, k);
}
if(s1 == nums1.length) {
return nums2[k + s2 -1];
}
if(1 == k) return Math.min(nums1[s1], nums2[s2]);
int an = Math.min(k/2, nums1.length), bn = k - an;
if(nums1[s1 + an - 1] == nums2[s2 + bn - 1])
return nums1[s1 + an -1];
if(nums1[s1 + an - 1] > nums2[s2 + bn - 1])
return findK(nums1, s1, nums2, s2+bn, k-bn);
else
return findK(nums1, s1+an, nums2, s2, k-an);
}
}