首页 > 编程语言 > 详细

【二分查找】4. 寻找两个有序数组的中位数

时间:2020-05-05 12:27:47      阅读:71      评论:0      收藏:0      [点我收藏+]

题目:

技术分享图片

 

 

解答:

方法一:

简单粗暴,先将两个数组合并,两个有序数组的合并也是归并排序中的一部分。然后根据奇数,还是偶数,返回中位数。

 1 class Solution {
 2     public double findMedianSortedArrays(int[] nums1, int[] nums2) {
 3     int[] nums;
 4     int m = nums1.length;
 5     int n = nums2.length;
 6     nums = new int[m + n];
 7     if (m == 0) 
 8     {
 9         if (n % 2 == 0) 
10         {
11             return (nums2[n / 2 - 1] + nums2[n / 2]) / 2.0;
12         } 
13         else 
14         {
15 
16             return nums2[n / 2];
17         }
18     }
19     if (n == 0) 
20     {
21         if (m % 2 == 0) 
22         {
23             return (nums1[m / 2 - 1] + nums1[m / 2]) / 2.0;
24         } 
25         else 
26         {
27             return nums1[m / 2];
28         }
29     }
30 
31     int count = 0;
32     int i = 0, j = 0;
33     while (count != (m + n)) 
34     {
35         if (i == m) 
36         {
37             while (j != n) 
38             {
39                 nums[count++] = nums2[j++];
40             }
41             break;
42         }
43         if (j == n) 
44         {
45             while (i != m) 
46             {
47                 nums[count++] = nums1[i++];
48             }
49             break;
50         }
51 
52         if (nums1[i] < nums2[j]) 
53         {
54             nums[count++] = nums1[i++];
55         } 
56         else 
57         {
58             nums[count++] = nums2[j++];
59         }
60     }
61 
62     if (count % 2 == 0) 
63     {
64         return (nums[count / 2 - 1] + nums[count / 2]) / 2.0;
65     } 
66     else 
67     {
68         return nums[count / 2];
69     }
70 }
71 }

 

方法二:

技术分享图片

 

 技术分享图片

 

 技术分享图片

 

 https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/4-xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-shu/

 1 class Solution {
 2 public:
 3     double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) 
 4     {
 5         int n = nums1.size();
 6         int m = nums2.size();
 7 
 8         if (n > m)  
 9         {
10             // 保证数组1一定最短
11             return findMedianSortedArrays(nums2, nums1);
12         }
13 
14         // Ci 为第i个数组的割,比如C1为2时表示第1个数组只有2个元素。
15         // LMaxi为第i个数组割后的左元素。RMini为第i个数组割后的右元素。
16         int LMax1, LMax2, RMin1, RMin2;
17         int c1, c2, lo = 0, hi = 2 * n;  //我们目前是虚拟加了‘#‘所以数组1是2*n长度
18 
19         while (lo <= hi)   //二分
20         {
21             c1 = (lo + hi) / 2;  //c1是二分的结果
22             c2 = m + n - c1;
23 
24             LMax1 = (c1 == 0) ? INT_MIN : nums1[(c1 - 1) / 2];
25             RMin1 = (c1 == 2 * n) ? INT_MAX : nums1[c1 / 2];
26             LMax2 = (c2 == 0) ? INT_MIN : nums2[(c2 - 1) / 2];
27             RMin2 = (c2 == 2 * m) ? INT_MAX : nums2[c2 / 2];
28 
29             if (LMax1 > RMin2)
30                 hi = c1 - 1;
31             else if (LMax2 > RMin1)
32                 lo = c1 + 1;
33             else
34                 break;
35         }
36         return (max(LMax1, LMax2) + min(RMin1, RMin2)) / 2.0;        
37     }
38 };

 

【二分查找】4. 寻找两个有序数组的中位数

原文:https://www.cnblogs.com/ocpc/p/12829998.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!