Median of two Sorted Arrays

Posted 北叶青藤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Median of two Sorted Arrays相关的知识,希望对你有一定的参考价值。

There are two sorted arrays A and B of size m and nrespectively. Find the median of the two sorted arrays.

Example

Given A=[1,2,3,4,5,6] and B=[2,3,4,5], the median is 3.5.

Given A=[1,2,3] and B=[4,5], the median is 3.

Challenge 

The overall run time complexity should be O(log (m+n)).

分析,先来复杂度高一点的:O(m + n).

分别用两个指针pa, pb指向两个array的第一个值,然后通过比较,不断移动pa或者pb的值,直到pa + pb + 1 = k.

 1 class Solution {
 2     public double findMedianSortedArrays(int[] A, int[] B) {
 3         int mid = (A.length + B.length) / 2;
 4         int v1 = findKthSortedArrays(A, B, mid + 1);
 5         if ((A.length + B.length) % 2 != 0) {
 6             return v1;
 7         } else {
 8             int v2 = findKthSortedArrays(A, B, mid);
 9             return (v1 + v2) / 2.0;
10         }
11     }
12     
13     private int findKthSortedArrays(int[] A, int[] B, int k) {
14         if (A.length == 0) return B[k - 1];
15         if (B.length == 0) return A[k - 1];
16         
17         int pa = 0, pb = 0;
18         while (pa + pb + 1 < k) {
19             long va = getValue(A, pa);
20             long vb = getValue(B, pb);
21 
22             if (va < vb) {
23                 pa++;
24             } else {
25                 pb++;
26             }
27         }
28         return (int)(Math.min(getValue(A, pa), getValue(B, pb)));
29     }
30     
31     private long getValue(int[] arr, int p) {
32         // I used Long.MAX_VALUE to handle the case in which arr contains Integer.MAX_VALUE
33         return (p == arr.length ? Long.MAX_VALUE : arr[p]); 
34     }
35 }

 

上面这个方法还可以改进,因为两个array都是排过序的,所以我们可以使用binary search来快查找。

其实下面这个解法是把问题转化成在两个排好序的数列中找出第一个最小的数。

如果A[i] <= B[j] (这里要确保 i + 1 + j + 1 = K), 那么我们可以肯定A[i]以及A[i]前面的数一定不可能是第K大的数(自己可以找几个例子试试)。那么我们可以在数组A中 i + 1 和 数组B中找第 k - i - 1 大的数,问题的规模是不是逐步缩小了?什么时候终止?就是当K = 1的时候,这个时候我们可以很容易找出第K(1)大的值。

 1 public class Solution {
 2   public double findMedianSortedArrays(int A[], int B[]) {
 3     int size = A.length + B.length;
 4     if (size % 2 == 1) {
 5       return findKth(A, B, 0, 0, size / 2 + 1);
 6     } else {
 7       return (findKth(A, B, 0, 0, size / 2) + findKth(A, B, 0, 0, size / 2 + 1)) / 2.0;
 8     }
 9   }
10 
11   // convert the question to find the first largest number
12   private int findKth(int A[], int B[], int index_A, int index_B, int k) {
13     int length_A = A.length - index_A;
14     int length_B = B.length - index_B;
15 
16     if (length_A == 0) {
17       return B[index_B + k - 1];
18     }
19     if (length_B == 0) {
20       return A[index_A + k - 1];
21     }
22     if (k == 1) {
23       return Math.min(A[index_A], B[index_B]);
24     }
25     // we need to switch because posB可能会超过B的size
26     if (length_A > length_B) {
27       return findKth(B, A, index_B, index_A, k);
28     }
29     int inrement_A = Math.min(k / 2, length_A);
30     int inrement_B = k - inrement_A;
31     if (A[index_A + inrement_A - 1] <= B[index_B + inrement_B - 1]) {
32       return findKth(A, B, index_A + inrement_A, index_B, k - inrement_A);
33     } else {
34       return findKth(A, B, index_A, index_B + inrement_B, k - inrement_B);
35     }
36   }
37 }

Reference:

http://blog.csdn.net/linhuanmars/article/details/19905515

以上是关于Median of two Sorted Arrays的主要内容,如果未能解决你的问题,请参考以下文章

leedcode Median of Two Sorted Arrays

#Leetcode# 4. Median of Two Sorted Arrays

LeetCode: Median of Two Sorted Arrays

** Median of Two Sorted Arrays

Leetcode 4. Median of Two Sorted Arrays(二分)

4. Median of Two Sorted Arrays