[leetcode]Median of Two Sorted Arrays

时间:2022-10-23 12:18:14

Median of Two Sorted Arrays

There are two sorted arrays A and B 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)).

看到sorted、log(m+n)肯定是二分查找了,只不过如何在两个排序数组中查找中间值呢?

算法思路:

这是某大神写的求两数组中第k小的数值的通用求法。大家可以参考一下,既然能求出任何k_th,那么中间值就不在话下了。本题假设是递增序列

假设a,b两个数组的长度都 > k/2,则取a[k/2 - 1]和b[k/2 - 1]做比较;

如果a[k/2 - 1]==b[k/2 - 1] ;则,返回a[k/2 - 1]。

如果a[k/2 - 1] > b[k/2 - 1] ;则b[k/2 - 1]之前的元素肯定是a,b两数组中k_th之前的元素了,之间剔除掉

同理a[k/2 - 1] < b[k/2 - 1] ; 将a[k/2 - 1]之前的元素剔除掉。

代码如下:

 1 public class Solution {
 2 public double findMedianSortedArrays(int a[], int b[]) {
 3         if(a.length + b.length == 0) return 0;
 4         int totalLength = a.length + b.length;
 5         if((totalLength & 1 )== 1){
 6             return findK_thElement(a, b, totalLength / 2 + 1);
 7         }else{
 8             return (findK_thElement(a, b, totalLength / 2) + findK_thElement(a, b, totalLength / 2 + 1)) / 2.0;
 9         }
10     }
11     
12     private double findK_thElement(int[] a,int[] b,int k){
13         if(a.length > b.length) return findK_thElement(b, a, k);
14         if(a.length == 0) return b[k - 1];
15         if(k == 1) return Math.min(a[0], b[0]);
16         int aIndex = Math.min(a.length, k / 2);
17         int bIndex = k - aIndex;
18         if(a[aIndex - 1] == b[bIndex - 1]){
19             return a[aIndex - 1];
20         }else if(a[aIndex - 1] < b[bIndex - 1]){
21             return findK_thElement(Arrays.copyOfRange(a, aIndex, a.length), b, k - aIndex);
22         }else{
23             return findK_thElement(a, Arrays.copyOfRange(b, bIndex, b.length), k - bIndex);
24         }
25     }
26 }