4. Median of Two Sorted Arrays
题目: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.0Example 2:
nums1 = [1, 2] nums2 = [3, 4] The median is (2 + 3)/2 = 2.5
思路:首先大致说一下题目的意思,题目中要求提供给你两个有序数组,在满足O(log(m+n))的时间复杂度条件下找到两个有序数组的所有数据中的中位数。看到题目后我陷入了深思。。。。。
做为一个算法小白,在面对O(log(m+n))的条件下,我首先想到的是二分查找、二叉树、堆排序这3方面。显然二叉树与堆排序在我理解下要首先构造出二叉树或堆结构,而这个构造过程就已经达不到O(log(m+n)),于是我看准二分查找。
作为一道LeetCode上分类为Hard的题目实属有不小的恐惧,于是我。。。呜呜呜,放弃了。在Discuss中看到大神们的神操作,我不禁甘拜下风,下面上代码并好好分析分析:
代码:
/*
*算法实现
*利用getkth来封装底层具体实现
*/
public double findMedianSortedArrays(int[] A, int[] B) {
//确定出中位数定位出来的两个位置l,r(初始位置为1)
int m = A.length, n = B.length;
int l = (m + n + 1) / 2;//中间偏左位置
int r = (m + n + 2) / 2;//中间偏右位置
return (getkth(A, 0, B, 0, l) + getkth(A, 0, B, 0, r)) / 2.0; //利用getkth找出l,r位置的数值
}
/*
*getkth方法
*采用递归,从二分查找的思路入手
*/
public double getkth(int[] A, int aStart, int[] B, int bStart, int k) {
//将特殊点列出来。
if (aStart > A.length - 1) return B[bStart + k - 1];
if (bStart > B.length - 1) return A[aStart + k - 1];
if (k == 1) return Math.min(A[aStart], B[bStart]);
int aMid = Integer.MAX_VALUE, bMid = Integer.MAX_VALUE;
if (aStart + k/2-1 < A.length) aMid = A[aStart + k/2-1 ];
if (bStart + k/2-1 < B.length) bMid = B[bStart + k/2-1 ];
//递归迭代
if (aMid < bMid)
return getkth(A, aStart + k/2, B, bStart, k - k/2);
else
return getkth(A, aStart, B, bStart + k/2, k - k/2);
}
看了很多遍,总有种似懂非懂的感觉。看来还要些时日来琢磨。。
有理解透彻的大佬欢迎评论,定虚心求教!