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

简介: 寻找两个正序数组中的中位数

公众号merlinsea


  • 题目连接
  • 题目描述
  • 给定两个大小分别为 mn 的正序(从小到大)数组 nums1nums2。请你找出并返回这两个正序数组的 中位数
  • 示例1


输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
  • 示例2
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5


  • 思路1
  • 把两个数组从小到大进行合并,合并成为一个数组以后选择中间的结果输出。由于题目给出的两个数组都保证了两个数组是从小到大的,因此我们可以每次用两个数组最小的元素比较,哪个小哪个就放前面。
  • 时间复杂度收O(m+n),空间复杂度是O(m+n)

640.png


class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        vector<int> arr;
        int i = 0;
        int j = 0;
        while(i<nums1.size() && j<nums2.size()){
            if(nums1[i]<nums2[j]){
                arr.push_back(nums1[i]);
                i++;
            }else{
                arr.push_back(nums2[j]);
                j++;
            }
        }
        while( i<nums1.size()){
            arr.push_back(nums1[i]);
            i++;
        }
        while(j<nums2.size()){
            arr.push_back(nums2[j]);
            j++;
        }
        // 保证 arr是有序的
        // 如果长度为奇数, 0 1 2 3 
        int mid = arr.size()/2;
        if(arr.size()/2 == 1){
            return arr[mid];
        }else{
            double res = (arr[mid]+arr[mid-1])/2.0;
            return res;
        }
    }
};


  • 思路2
  • 参考找位置的思路,比如在一个总长度为2n的有序序列中,我们需要返回第n个和第n+1个元素的平均值即可;对于长度为2n+1的有序序列中,我们需要返回第n+1个位置的元素即可,因此我们可以发现寻找中位数其核心是寻找第k个位置的元素。
  • 在寻找第k个位置的元素的问题中,现在题目给了我们两个长度分别为m和n的有序序列,可以考虑先排除前k/2个元素,比如我们首先在长度为m的序列中找到第k/2个元素a,然后在长度为n的序列中也找到第k/2个元素b,假设a<b,则说明在长度为m的序列中前k/2个元素一定不是我们要寻找的元素(故可以排除),因此接下来我们只需要在长度为m-k/2的有序序列和长度为n的有序序列中找合并以后的排在第k/2个元素即可。
  • 时间复杂度是log(m+n),空间复杂度是log(max(m,n))
class Solution {
public:
/*
解题思路:
寻找第k大大数组
*/
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int len1 = nums1.size();
        int len2 = nums2.size();
        int left = (len1+len2+1)/2;
        int right = (len1+len2+2)/2;
        int mid1 = find(nums1,0,nums2,0,left);
        int mid2 = find(nums1,0,nums2,0,right);
        return (mid1+mid2)/2.0;
    }
    int find(vector<int> &nums1,int i,vector<int> &nums2,int j,int k){
        if(i>=nums1.size()){
            //说明nums1是空数组
            return nums2[j+k-1];
        }
        if(j>=nums2.size()){
            //说明num2为空
            return nums1[i+k-1];
        }
        //当k==1的时候,显然k/2 = 0 这在本题中没有意义
        if(k==1){
            return min(nums1[i],nums2[j]);
        }
        //每个数组前k/2位置的元素
        //为什么在数组不足k/2个元素时候需要将val1要设置为INT_MAX ? 重点
        //为什么需要每次找k/2个元素!!
        int val1 = INT_MAX;
        if(i+k/2-1<nums1.size()){
            val1 = nums1[i+k/2-1];
        }
        int val2 = INT_MAX;
        if(j+k/2-1<nums2.size()){
            val2 = nums2[j+k/2-1];
        }
        if(val1 < val2){
            return find(nums1,i+k/2,nums2,j,k-k/2);
        }else{
            return find(nums1,i,nums2,j+k/2,k-k/2);
        }
    }
};


算法训练营永久班上课开始啦,欢迎大家积极报名~

奔跑的小梁,公众号:梁霖编程工具库算法训练营春节价格通知,2023年2月12日


相关文章
|
1月前
|
人工智能 自然语言处理 安全
1个Skill,让开源变得So Easy
Auto-Convert Project to Open Source 是一款面向 Claude/Cursor 的 AI 编程技能,专治「能跑但不敢开源」的项目。它提供安全扫描、死代码清理、结构规范化、文档对齐与验证流程,全程副本操作、人工决策、可回滚,助你从「在我机器上能跑」迈向真正可维护、可开源。(239字)
132 11
|
分布式计算 Hadoop Java
HBase 安装之后版本的验证的bug:(错误的替换、找不到或无法加载主类、SLF4J)
HBase 安装之后版本的验证的bug:(错误的替换、找不到或无法加载主类、SLF4J)
1301 1
HBase 安装之后版本的验证的bug:(错误的替换、找不到或无法加载主类、SLF4J)
|
10月前
|
存储 算法 API
还社交一个自由的未来:去中心化社交网络,会是下一个“推特”吗?
还社交一个自由的未来:去中心化社交网络,会是下一个“推特”吗?
328 5
一款内容直观的引导页HTML源码
一款内容直观的引导页HTML源码
245 6
|
机器学习/深度学习 人工智能 并行计算
《解锁 Eigen 库在 C++人工智能项目中的潜能与优化之道》
Eigen 库是 C++ 人工智能项目的得力助手,专注于线性代数运算,广泛应用于神经网络、数据预处理和优化算法等领域。其高效的内存布局、表达式模板和多线程并行计算等优化技巧,显著提升了项目性能,助力开发者构建高效的人工智能系统。
481 20
|
JavaScript API 数据安全/隐私保护
淘宝店铺订单相关API接口详解
本文详细介绍了淘宝店铺订单相关的三个关键API接口:订单列表、订单详情和订单物流。通过这些接口,开发者可以获取订单信息、买家详情、商品清单、支付信息及物流轨迹,支持多种筛选条件和复杂参数传递。此外,文章还强调了接口权限申请、数据安全处理及调用频率限制等注意事项,帮助开发者高效集成这些接口,提升电商系统的功能和用户体验。供稿者:Taobaoapi2014。 (239字符)
|
数据管理 开发工具 NoSQL
mongo-connector实现MongoDB与elasticsearch实时同步深入详解
mongo-connector工具创建一个从MongoDB簇到一个或多个目标系统的管道,目标系统包括:Solr,Elasticsearch,或MongoDB簇。
2319 0
|
安全 Java Android开发
Eclipse Paho MQTT客户端Java源码分析
Eclipse Paho MQTT客户端Java源码分析
814 0
Eclipse Paho MQTT客户端Java源码分析
|
机器学习/深度学习 人工智能 计算机视觉
YOLOv7 在 ML.NET 中使用 ONNX 检测对象
本文介绍如何在 ML.NET 中使用 YOLOv7 的 ONNX 模型来检测图像中的对象。
880 0
YOLOv7 在 ML.NET 中使用 ONNX 检测对象