题目描述
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。
请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
样例
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
算法1
(二分) $O(log(min(m, n))$
比较复杂,就不写了,贴两个题解链接hh,感觉是最简洁的写法了。
时间复杂度
参考文献
https://leetcode.com/problems/median-of-two-sorted-arrays/discuss/2471/Very-concise-O(log(min(MN)))-iterative-solution-with-detailed-explanation
https://www.acwing.com/solution/content/50/
C++ 代码
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size(), n = nums2.size();
if (m > n) return findMedianSortedArrays(nums2, nums1);
int l = 0, r = 2 * m;
while (l <= r){
int c1 = l + (r - l) / 2;
int c2 = m + n - c1;
double l1 = c1 == 0 ? INT_MIN : nums1[c1 - 1 >> 1];
double r1 = c1 == 2 * m ? INT_MAX : nums1[c1 >> 1];
double l2 = c2 == 0 ? INT_MIN : nums2[c2 - 1 >> 1];
double r2 = c2 == 2 * n ? INT_MAX : nums2[c2 >> 1];
if (l1 > r2) r = c1 - 1;
else if (l2 > r1) l = c1 + 1;
else return max(l1, l2) / 2.0 + min(r1, r2) / 2.0;
}
return 0;
}
};