原题链接在这里:https://leetcode.com/problems/median-of-two-sorted-arrays/
题目:
here 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.0
Example 2:
nums1 = [1, 2] nums2 = [3, 4] The median is (2 + 3)/2 = 2.5
题解:
首先我们先明确什么是median,即中位数.
引用Wikipedia对中位数的定义:
计算有限个数的数据的中位数的方法是:把所有的同类数据按照大小的顺序排列。如果数据的个数是奇数,则中间那个数据就是这群数据的中位数;如果数据的个数是偶数,则中间那2个数据的算术平均值就是这群数据的中位数。
所以要看 m+n是技术还是偶数,若是偶数,应该返回中间两个数的算术平方和。
在比较过程中,取nums1得中位数,nums2的中位数比较,若是nums1的中位数小,说明要找的中位数肯定不包括在 nums1的中位数和nums1中位数前面的数,为什么呢?如下是说明例子:
AC Java:
1 public class Solution { 2 public double findMedianSortedArrays(int[] nums1, int[] nums2) { 3 int m = nums1.length; 4 int n = nums2.length; 5 int sum = m+n; 6 if(sum % 2 != 0){ 7 return findKth(nums1, 0, m - 1, nums2, 0, n - 1, sum / 2 + 1); 8 }else{ 9 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.0; 10 } 11 } 12 private double findKth(int[] a, int aStart, int aEnd, int[] b, int bStart, int bEnd, int k){ 13 int m = aEnd - aStart + 1; 14 int n = bEnd - bStart + 1; 15 //统一长度,将短的array放到前面来 16 if(m > n){ 17 return findKth(b,bStart,bEnd,a,aStart,aEnd,k); 18 } 19 20 //a is an empty array 21 if(m == 0){ 22 return b[bStart + k -1]; 23 } 24 25 //Stop condition, 都减到头了, 都剩下了一个元素 26 if(k == 1){ 27 return Math.min(a[aStart], b[bStart]); 28 } 29 30 int pa = Math.min(k / 2,m); 31 int pb = k - pa; 32 33 if(a[aStart + pa -1] < b[bStart + pb - 1]){ 34 return findKth(a, aStart + pa, aEnd, b, bStart, bEnd, k - pa); 35 }else if(a[aStart + pa -1] > b[bStart + pb - 1]){ 36 return findKth(a, aStart, aEnd, b, bStart + pb, bEnd, k - pb); 37 }else{ 38 return a[aStart + pa -1]; 39 } 40 } 41 }
参见这两篇帖子:javascript:void(0)