题目

4. 寻找两个正序数组的中位数

答案

二分查找:时间复杂度要求为O(log(m+n))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
//算法复杂度要求为O(log(m+n))
//保证第一个数组为较短长度的一个
if(nums1.size() > nums2.size())
{
return findMedianSortedArrays(nums2, nums1);
}

//i为第一个数组分割线的位置,j为第二个数组分割线的位置
//即确定i即可确定j,j=left_size-i
//即任务为确定i的位置,i的范围为[0,m]
//二分法确定i的位置
int m = nums1.size();
int n = nums2.size();
int left_size = (m + n + 1) / 2;

int left = 0;
int right = m;
//要求:num1[i-1]<=nums2[j],nums1[i]>nums[j-1]
//left和right不断逼近直至left>=right
while (left < right) {
int i = left + (right - left) / 2;
int j = left_size - i;

// Ensure the indices are within bounds before accessing elements
if (i < m && nums1[i] < nums2[j - 1]) {
left = i + 1;
} else {
right = i;
}
}

int i = left;
int j = left_size - i;

int nums1_left_max = (i == 0) ? INT_MIN : nums1[i - 1];
int nums1_right_min = (i == m) ? INT_MAX : nums1[i];
int nums2_left_max = (j == 0) ? INT_MIN : nums2[j - 1];
int nums2_right_min = (j == n) ? INT_MAX : nums2[j];
if ((m + n) % 2 == 1) {
return max(nums1_left_max, nums2_left_max);
} else {
return (double)(max(nums1_left_max, nums2_left_max) + min(nums1_right_min, nums2_right_min)) / 2;
}
}
};

__END__