4.Median of Two Sorted Arrays

Posted luohys

tags:

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

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)).

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

求两个排序数组的中位数。题目关键是时间复杂度要求O(log (m+n))。
想了好久好像有点思路但是又不明确,看了下官方解答,解法确实比较巧。

 

二分查找

规定了复杂度,基本就是二分查找了。

这道题的思路就是:两个数组A,B的中位数,左边和右边的数的个数肯定是相等的,如果左边的数有i个来自数组A,那么就有(len(A) + len(B))/2-i个来自数组B。

只要确定来自数组A的最大值小于等于数组B中余下的最小值就可以了。

可以配合代码理解:

 1 public class Solution {
 2     public double FindMedianSortedArrays(int[] nums1, int[] nums2) {
 3         int m = nums1.Length;
 4         int n = nums2.Length;
 5         if (m > n)
 6         {
 7             return FindMedianSortedArrays(nums2, nums1);
 8         }
 9         int min = 0;
10         int max = m;
11         int half = (m + n + 1) / 2;
12         while (min <= max)
13         {
14             int i = (min + max) / 2;
15             int j = half - i;
16             if (i < max && nums1[i] < nums2[j - 1])
17             {
18                 min = i + 1;
19             }
20             else if (i > min && nums1[i - 1] > nums2[j])
21             {
22                 max = i - 1;
23             }
24             else
25             {
26                 int maxLeft = 0;
27                 if (i == 0)
28                 {
29                     maxLeft = nums2[j - 1];
30                 }
31                 else if (j == 0)
32                 {
33                     maxLeft = nums1[i - 1];
34                 }
35                 else
36                 {
37                     maxLeft = Math.Max(nums1[i - 1], nums2[j - 1]);
38                 }
39                 if (((m + n) & 1) == 1)
40                 {
41                     return maxLeft;
42                 }
43                 
44                 int minRight = 0;
45                 if (i == m)
46                 {
47                     minRight = nums2[j];
48                 }
49                 else if (j == n)
50                 {
51                     minRight = nums1[i];
52                 }
53                 else
54                 {
55                     minRight = Math.Min(nums1[i], nums2[j]);
56                 }
57                 return (maxLeft + minRight) / 2d;
58             }
59         }
60         return 0d;
61     }
62 }

也可以通过直接比较两个数组的中位数来进行二分查找,时间复杂度都是O(log (min(m+n))),就不再赘述了。(主要是语言描述太麻烦=_=)




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

4. Median of Two Sorted Arrays

4. Median of Two Sorted Arrays

4. Median of Two Sorted Arrays

4. Median of Two Sorted Arrays

4. Median of Two Sorted Arrays

4. Median of Two Sorted Arrays