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

题目:

 

 

解答:

方法一:

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

 1 class Solution {
 2 public:
 3     double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) 
 4     {
 5         int m = nums1.size();
 6         int n = nums2.size();
 7         vector<int> nums;
 8 
 9         int i = 0;
10         int j = 0;
11         while (i < m && j < n)
12         {
13             if (nums1[i] < nums2[j])
14             {
15                 nums.push_back(nums1[i++]);
16             }
17             else if (nums1[i] >= nums2[j])
18             {
19                 nums.push_back(nums2[j++]);
20             }
21         }
22 
23         while (i < m)
24         {
25             nums.push_back(nums1[i++]);
26         }
27         while (j < n)
28         {
29             nums.push_back(nums2[j++]);
30         }
31         
32         if (nums.size() % 2 == 0)
33         {
34             // std::cout << nums[0] << "\t" << nums[1] << "\t" << nums[2] << "\t" << nums[3];
35             return (nums[nums.size() /  2 - 1] + nums[nums.size()/2]) / 2.0;
36         }
37         else
38         {
39             // std::cout << nums[0] << "\t" << nums[1] << "\t" << nums[2] << std::endl;
40             return nums[nums.size()/2];
41         }
42     }
43 };

 

方法二:

 

 

 

 

 

 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 };

 

posted @ 2020-05-05 11:30  梦醒潇湘  阅读(403)  评论(0)    收藏  举报