【Hot 100】4. 寻找两个正序数组的中位数

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:算法专栏
  • 💥 标题:【Hot 100】4. 寻找两个正序数组的中位数
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!

引言

这道题目很像吉比特面试的时候面试官和我讨论的题目,是针对于中位数的深入理解,以及解题技巧。

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

  • 🎈 题目链接:
  • 🎈 做题状态:

暴力解题

使用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) 还是没有达到很小,但是比刚才的暴力方法更好了一点

代码优化

复杂度更低的代码思路,可以直接去看官方的视频教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值