引言
这道题目很像吉比特面试的时候面试官和我讨论的题目,是针对于中位数的深入理解,以及解题技巧。
寻找两个正序数组的中位数
- 🎈 题目链接:
- 🎈 做题状态:
暴力解题
使用stl自带的二分搜索函数库,来实现这道题目,但是时间复杂度不满足要求。
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
// 如果先合并数组再找中位数的时间复杂度是 O(m*log(n)*n) m 是nums2的个数, n是nums1的个数,而且还会随着插入数据的增多n会变化。这样不满足题目要求
int n = nums1.size() + nums2.size();
nums1.reserve(n); // 预留空间,防止多次扩容
for (int i = 0; i < nums2.size(); ++i)
{
// 查找第一个大于等于目标值的位置,并返回迭代器,如果没有大于的话,就插入在最后位置
auto it = lower_bound(nums1.begin(), nums1.end(), nums2[i]);
//cout << "nums2[i] = " << nums2[i] << endl;
nums1.insert(it, nums2[i]); // 插入数据
}
// 判断奇偶性
if (n % 2 == 0)
{
// 偶数个
return (nums1[n/2] + nums1[n/2-1]) / 2.0;
}
return nums1[n/2];
}
};
还有一种办法,用分别用一个指针指向两个数组的开头,并记录移动的总次数,每次比较这两个指针的值,移动小的数据,此方法的时间复杂度为 O(m+n) 还是没有达到很小,但是比刚才的暴力方法更好了一点
代码优化
复杂度更低的代码思路,可以直接去看官方的视频教程。