题意
给定两个有序数组arr1和arr2,已知两个数组的长度都为 N,求两个数组中所有数的上中位数
上中位数:假设递增序列长度为 n,若 n 为奇数,则上中位数为第 n/2+1 个数,否则为第n/2个数
[要求]
时间复杂度为O(logN)O(logN)O(logN),额外空间复杂度为O(1)O(1)O(1)
题解
要求时间复杂度为O(logN)O(logN)O(logN),很容易想到二分查找,关键是怎么二分
-
如果每个数组中只有一个元素,较小的那个元素就是整体的上中位数,如果两个元素相等,随便返回哪个都可以。
-
如果数组中不止一个元素,找到两个数组的中间位置mid1和mid2。
-
如果arr1[mid1] == arr2[mid2],不管每个数组中元素的个数是奇数还是偶数,这两个数都可以是整体的上中位数,返回其中一个就可以。
-
如果arr1[mid1] > arr2[mid2],每个数组的个数是奇数的情况下:数组arr1中mid1位置以后的数都不可能是整体的上中位数,数组arr2中mid2位置以前的数都不可能是整体的上中位数。所以现在只需要考虑arr1[left1…mid1]、arr2[mid2…right],这两部分的元素个数相同,它们的上中位数就是整体的上中位数。
-
如果arr1[mid1] > arr2[mid2],每个数组的个数是偶数的情况下:数组arr1中mid1位置以后的数都不可能是整体的上中位数,数组arr2中mid2位置以后包括mid2位置,都不可能是整体的上中位数。所以现在只需要考虑arr1[left1…mid1]、arr2[mid2+1…right],这两部分的元素个数相同,它们的上中位数就是整体的上中位数。
-
arr1[mid1] < arr2[mid2]的情况,分析同上。
class Solution {
public:
/**
* find median in two sorted array
* @param arr1 int整型vector the array1
* @param arr2 int整型vector the array2
* @return int整型
*/
int findMedianinTwoSortedAray(vector<int>& arr1, vector<int>& arr2) {
int end1 = arr1.size()-1;
int end2 = arr2.size()-1;
int start1 = 0, start2 = 0;
int mid1, mid2;
while(start1 < end1){
mid1 = (start1 + end1)/2;
mid2 = (start2 + end2)/2;
// 如果有序数组是偶数,偏移量为1,否则为0
int offset = (end1-start1+1)&1^1;
if(arr1[mid1] == arr2[mid2]){
return arr1[mid1];
}
else if(arr1[mid1] < arr2[mid2]){
start1 = mid1 + offset;
end2 = mid2;
}
else{
end1 = mid1;
start2 = mid2 + offset;
}
}
return min(arr1[start1], arr2[start2]);
}
};
本文介绍了一种高效算法,用于找出两个有序数组的上中位数,采用二分查找法实现O(logN)的时间复杂度,并确保额外空间复杂度为O(1)。

1万+

被折叠的 条评论
为什么被折叠?



