【二分查找】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 };
方法二:



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

浙公网安备 33010602011771号