题目:
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)).
思路:题目大意是找到两个数组的中位数,查了下相关定义,计算有限个数的数据的中位数的方法是:把所有的同类数据按照大小的顺序排列。如果数据的个数是奇数,则中间那个数据就是这群数据的中位数;如果数据的个数是偶数,则中间那2个数据的算术平均值就是这群数据的中位数。
分享下网上很简洁思路的算法,找两个数组中第k小元素,该方法的核心是将原问题转变成一个寻找第k小数的问题(假设两个原序列升序排列),这样中位数实际上是第(m+n)/2小的数。所以只要解决了第k小数的问题,原问题也得以解决。
首先假设数组A和B的元素个数都大于k/2,我们比较A[k/2-1]和B[k/2-1]两个元素,这两个元素分别表示A的第k/2小的元素和B的第k/2小的元素。这两个元素比较共有三种情况:>、<和=。如果A[k/2-1]<B[k/2-1],这表示A[0]到A[k/2-1]的元素都在A和B合并之后的前k小的元素中。换句话说,A[k/2-1]不可能大于两数组合并之后的第k小值,所以我们可以将其抛弃。
代码:
public class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int len1 = nums1.length; int len2 = nums2.length; int total = len1 + len2; if(total % 2 == 1) return findKth(nums1, 0, len1-1, nums2, 0, len2-1, total/2+1); else return (findKth(nums1, 0, len1-1, nums2, 0, len2-1, total/2) + findKth(nums1, 0, len1-1, nums2, 0, len2-1, total/2+1)) / 2; } public double findKth(int[] a, int astart, int aend, int[] b, int bstart, int bend, int k){ int m = aend - astart + 1; int n = bend - bstart + 1; if(m > n) //时刻保持a为最短 方便后续判断 return findKth(b, bstart, bend, a, astart, aend, k); if(m == 0) //当有一个数组为空时 return b[bstart + k-1]; // 第k小的 if(k == 1) //找最小的 return Math.min(a[astart], b[bstart]); int da = Math.min(k/2, m); //当m的长度不足k时,需要整个的a数组 int db = k - da; if(a[astart + da - 1] < b[bstart + db - 1]){ return findKth(a, astart+da, aend, b, bstart, bend, k - da); }else if(a[astart + da - 1] > b[bstart + db - 1]){ return findKth(a, astart, aend, b, bstart+db, bend, k - db); }else{ return a[astart + da - 1]; } } }
参考链接: http://blog.csdn.net/yutianzuijin/article/details/11499917/
http://www.cnblogs.com/springfor/p/3861890.html