原题链接在这里:https://leetcode.com/problems/median-of-two-sorted-arrays/
首先我们先明确什么是median,即中位数。
引用Wikipedia对中位数的定义:
计算有限个数的数据的中位数的方法是:把所有的同类数据按照大小的顺序排列。如果数据的个数是奇数,则中间那个数据就是这群数据的中位数;如果数据的个数是偶数,则中间那2个数据的算术平均值就是这群数据的中位数。
所以要看 m+n是技术还是偶数,若是偶数,应该返回中间两个数的算术平方和。
在比较过程中,取nums1得中位数,nums2的中位数比较,若是nums1的中位数小,说明要找的中位数肯定不包括在 nums1的中位数和nums1中位数前面的数,为什么呢?如下是说明例子:
AC Java:
public class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int m = nums1.length; int n = nums2.length; int sum = m+n; if(sum%2 != 0){ return findKth(nums1, 0, m-1, nums2, 0, n-1, sum/2 + 1); }else{ return (findKth(nums1, 0, m-1, nums2, 0, n-1, sum/2) + findKth(nums1, 0, m-1, nums2, 0, n-1, sum/2 + 1))/2; } } private 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; //统一长度,将短的array放到前面来 if(m > n){ return findKth(b,bStart,bEnd,a,aStart,aEnd,k); } //a is an empty array if(m == 0){ return b[k-1]; } //Stop condition, 都减到头了, 都剩下了一个元素 if(k == 1){ return Math.min(a[aStart],b[bStart]); } int pa = Math.min(k/2,m); int pb = k-pa; if(a[aStart+ pa -1] < b[bStart+pb-1]){ return findKth(a,aStart+pa,aEnd,b,bStart,bEnd,k-pa); }else if(a[aStart+ pa -1] > b[bStart+pb-1]){ return findKth(a,aStart,aEnd,b,bStart+pb,bEnd,k-pb); }else{ return a[aStart+ pa -1]; } } }
参见这两篇帖子:http://www.cnblogs.com/springfor/p/3861890.html
http://blog.csdn.net/yutianzuijin/article/details/11499917
LeetCode Median of Two Sorted Arrays
原文:http://www.cnblogs.com/Dylan-Java-NYC/p/4886836.html