一、题目叙述:
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)).
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
Subscribe to see which companies asked this question.
二、解题思路:
Hard题。&参考。
思路:
主要问题在时间复杂度的要求上,否则直接排序,返回中位数就可以。
使用二分查找、递归的思想。
其实问题就是在两有序数组中找第K小的元素。
假设两数组长度均大于等于 k/ 2。比较nums1[s1 + k / 2 - 1]及nums2[s2 + k/2 -1]若 nums1[s1 + k / 2 - 1]<nums2[s2 + k/2 -1],那么nums1中的 下标为s1 到 s1 + k / 2 - 1就可以排除了,反之亦然。
若 两数组中有一数组为空, 那么直接返回另一数组第k个元素值即可。
若 k 为1 ,那么返回两数组较小的第一个元素即可。
三、源码:
public class Solution
{
public double findMedianSortedArrays(int[] nums1, int[] nums2)
{
int q = nums1.length + nums2.length;
if (q % 2 == 0)
return (findk(nums1, 0, nums2, 0, q / 2 + 1) + findk(nums1, 0, nums2, 0, q / 2)) / 2.0;
else
return findk(nums1, 0, nums2, 0, q / 2 + 1) / 1.0;
}
private int findk(int[] nums1, int s1, int[] nums2, int s2, int k)
{
if (s1 >= nums1.length)
return nums2[s2 + k - 1];
if (s2 >= nums2.length)
return nums1[s1 + k - 1];
if (k == 1)
return Math.min(nums1[s1], nums2[s2]);
int m1 = s1 + k / 2 - 1;
int m2 = s2 + k / 2 - 1;
int a1 = m1 < nums1.length? nums1[m1] : Integer.MAX_VALUE;
int b1 = m2 < nums2.length? nums2[m2] : Integer.MAX_VALUE;
if (a1 < b1) return findk(nums1, m1 + 1, nums2, s2, k - k / 2);
else return findk(nums1, s1, nums2, m2 + 1, k - k / 2);
}
public static void main(String[] args)
{
Solution so = new Solution();
System.out.println(so.findMedianSortedArrays(new int[]{1, 2},new int[]{3,4}));
}
}