vector<int> mergevector(vector<int>& nums1, vector<int>& nums2)
{
auto p1 = nums1.begin(),p2 = nums2.begin();
vector<int> vec;
while(p1 != nums1.end() && p2 != nums2.end())
{
if(*p1 < *p2)
{
vec.push_back(*p1);
p1++;
}
else
{
vec.push_back(*p2);
p2++;
}
}
if(p1 == nums1.end())
{
while(p2 != nums2.end())
{
vec.push_back(*p2);
p2++;
}
}
else
{
while(p1 != nums1.end())
{
vec.push_back(*p1);
p1++;
}
}
return vec;
}
mergeVector 函数
mergeVector
函数接收两个整数向量 nums1
和 nums2
,并返回一个新的整数向量,其中包含 nums1
和 nums2
中的所有元素,且这些元素是排序的。该函数使用两个指针 p1
和 p2
分别遍历 nums1
和 nums2
,每次将较小的元素添加到结果向量 vec
中,并移动相应的指针。当一个向量遍历完时,它将另一个向量中剩余的所有元素添加到结果向量中。
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int size = nums1.size() + nums2.size();
vector<int> vec = mergevector(nums1,nums2);
if(size % 2 == 1)
{
return double(vec[vec.size() / 2]);
}
return double(vec[vec.size() / 2] + vec[vec.size() / 2 - 1]) / 2;
}
findMedianSortedArrays 函数
findMedianSortedArrays
函数接收两个已排序的整数向量 nums1
和 nums2
,并返回它们的中位数。它首先计算两个向量的大小之和,然后调用 mergeVector
函数合并这两个向量并得到一个排序的向量 vec
。接下来,它根据向量 vec
的大小计算中位数。
- 如果
vec
的大小是奇数,则中位数是vec
中间的元素。 - 如果
vec
的大小是偶数,则中位数是vec
中间两个元素的平均值。
mergeVector
函数的时间复杂度主要取决于两个指针 p1
和 p2
遍历 nums1
和 nums2
的过程。由于这两个指针同时向前移动,并且每个元素只会被访问和处理一次,因此这个过程的时间复杂度是线性的,即 O(n + m),其中 n 是 nums1
的大小,m 是 nums2
的大小。
合并两个向量的操作(即 vec.push_back(*p1)
或 vec.push_back(*p2)
)也是线性时间复杂度,因为它涉及将元素添加到结果向量 vec
的末尾。然而,这个操作的时间复杂度通常被包含在 O(n + m) 中,因为它与指针的遍历过程紧密相关。
因此,mergeVector
函数的总时间复杂度是 O(n + m),其中 n 是 nums1
的大小,m 是 nums2
的大小。
由于 findMedianSortedArrays
函数只是调用了 mergeVector
并执行了一些常量时间的操作,它的时间复杂度也是 O(n + m),其中 n 和 m 分别是两个输入向量的大小。这是因为 mergeVector
的执行时间支配了整个 findMedianSortedArrays
函数的执行时间。