[LeetCode]4 两个有序数组的中位数

2023-11-17

Median of Two Sorted Arrays(两个有序数组的中位数)

【难度:hard】
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
给定两个有序数组nums1和nums2,大小分别为m和n,找到他们的中位数,时间复杂度上限为O(log (m+n))。


解题思路

本题若没有限制时间复杂度为O(log(m+n))的话,对两个数组使用归并排序,很容易可以找到他们的中位数,所用时间复杂度为O(m*n)。但是要将时间复杂度降为O(log(m+n)),就需要尝试对两个数组同时进行二分查找,逐步排除掉不可能出现中位数的区间,最后找到所求的中位数。这种解法的主要思想就是:
如果数组a的中位数小于数组b的中位数,那么整体的中位数只可能出现在a的右区间加上b的左区间之中;
如果数组a的中位数大于等于数组b的中位数,那么整体的中位数只可能出现在a的左区间加上b的右区间之中。
关键就是利用分治的思想逐渐缩小a的区间和b的区间来找到中位数。


c++代码如下:

//归并排序
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {

        int m = nums1.size();
        int n = nums2.size();
        if (nums1.empty()) {
            if (n%2 != 0)
                return 1.0*nums2[n/2];
            return (nums2[n/2]+nums2[n/2-1])/2.0;
        }
        if (nums2.empty()) {
            if (m%2 != 0)
                return 1.0*nums1[m/2];
            return (nums1[m/2]+nums1[m/2-1])/2.0;
        }
        int i = 0;
        int j = 0;
        vector<int> ans;
        while (i < m && j < n) {
            if (nums1[i] <= nums2[j]) {
                ans.push_back(nums1[i]);
                i++;
            } else {
                ans.push_back(nums2[j]);
                j++;
            }
        }
        if (i < m) {
            for (; i < m; i++)
                ans.push_back(nums1[i]);
        } else if (j < n) {
            for (; j < n; j++)
                ans.push_back(nums2[j]);
        }
        int len = ans.size();
        if (len%2 != 0)
            return 1.0*ans[len/2];
        return (ans[len/2]+ans[len/2-1])/2.0;
    }

};
//二分查找
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {

        int m = nums1.size();
        int n = nums2.size();
        if (nums1.empty()) {
            if (n%2 != 0)
                return 1.0*nums2[n/2];
            return (nums2[n/2]+nums2[n/2-1])/2.0;
        }
        if (nums2.empty()) {
            if (m%2 != 0)
                return 1.0*nums1[m/2];
            return (nums1[m/2]+nums1[m/2-1])/2.0;
        }

        int total = (m+n+1)/2;
        int total2 = (m+n+2)/2;

        return (find_kth(nums1,0,nums2,0,total)+find_kth(nums1,0,nums2,0,total2))/2.0;
    }
    double find_kth(vector<int> a, int a_begin, vector<int> b, int b_begin, int k) {
        if (a_begin > a.size()-1)
            return b[b_begin+k-1];
        if (b_begin > b.size()-1)
            return a[a_begin+k-1];
        if (k == 1)
            return min(a[a_begin],b[b_begin]);

        int mid_a = INT_MAX;
        int mid_b = INT_MAX;
        if (a_begin+k/2-1 < a.size())
            mid_a = a[a_begin+k/2-1];
        if (b_begin+k/2-1 < b.size())
            mid_b = b[b_begin+k/2-1];

        if (mid_a < mid_b)
            return find_kth(a,a_begin+k/2,b,b_begin,k-k/2);
        return find_kth(a,a_begin,b,b_begin+k/2,k-k/2);
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[LeetCode]4 两个有序数组的中位数 的相关文章

  • 馆员工作站的产品功能以及特点介绍

    馆员工作站通过跟电脑相互连接使用 工作人员对图书进行标签加工时 可使用设备对粘贴在图书上的RFID电子标签进行加工 通过条形码扫描器扫描图书上的条形码 同时识别图书上的电子标签 对电子标签和图书条码进行标签初始化操作 除此之外 还可以进行图
  • 6个常用的Python编程开发工具

    随着互联网的迅速发展 新技术不断创新 万物互联的时代 企业对IT人员的需求不断增加 很多想要进入IT行业的小伙伴经常会抱怨 想入门 却不知道从哪下手 最近就有不少小伙伴和小编抱怨 我想学Python 但是都不知道该使用哪些工具 别着急 学习
  • ES6入门

    一 let和const命令 1 let命令 类似于var 但是只在let所在的代码块有效 不存在变量提升 即一定要先声明后使用 暂时性死区 待理解 不允许重复声明 2 块级作用域 内层不影响外层 3 const命令 const声明一个常量

随机推荐

  • JAVA 什么是多态?

    面向对象编程有三大特性 封装 继承 多态 封装隐藏了类的内部实现机制 可以在不影响使用的情况下改变类的内部结构 同时也保护了数据 对外界而已它的内部细节是隐藏的 暴露给外界的只是它的访问方法 继承是为了重用父类代码 两个类若存在IS A的关
  • Ag Grid 组件 Vue Data Grid: Components

    目录 声明自定义组件 内联 组件 本地声明的组件 外部化的 JavaScript 组件 js 文件 外部化单文件组件 SFC vue 文件 注册自定义组件 注册内联自定义组件 注册非内联自定义组件 1 按名称 2 直接引用 已弃用 按名称引
  • 【yolov7系列二】正负样本分配策略

    本文主要就yolov7的正负样本筛选策略 并与yolov5 yolov6进行比对 首先接着上一篇yolov7系列一 网络整体结构 填几个小坑 希望对大家没有造成困扰 如 E ELAN层 在cat后需要要conv层做特征融合 还有SPPCSP
  • python virtualenv

    文章目录 powershell 参考文章 https www cnblogs com freely p 8022923 html https blog csdn net u012206617 article details 90294421
  • Inorder Successor in BST

    Given a binary search tree and a node in it find the in order successor of that node in the BST Note If the given node h
  • UNI-APP_APP(webview)集成X5内核

    官方文档 https uniapp dcloud net cn tutorial app android x5 html 腾讯TBS x5内核仅支持Android平台 iOS只能使用自带的WKWebview 打开项目的manifest js
  • Linux awk 命令

    AWK是一种处理文本文件的语言 是一个强大的文本分析工具 之所以叫AWK是因为其取了三位创始人 Alfred Aho Peter Weinberger 和 Brian Kernighan 的Family Name的首字符 语法 awk 选项
  • Keil环境下CANopenNode移植到STM32问题记录(一)---printf重定向问题

    文章目录 问题描述 问题结决 思考 相关文章 在直接将CANopenSTM32的示例工程直接移植到Keil环境下 如果移植工程未实现printf函数重定向 则要注释掉log printf下面的printf函数 使日志打印失效 Printf
  • SQL注入之盲注

    SQL注入之盲注 前言 一 盲注分类 二 具体解析 1 基于布尔的sql盲注 首先要先了解一下sql注入截取字符串常用的函数 1 mid 函数 2 substr 函数 3 left 函数 具体注入方法 2 基于时间的SQL盲注 3 基于报错
  • Java实验3与第五周总结

    1 已知字符串 this is a test of java 按要求执行以下操作 要求源代码 结果截图 统计该字符串中字母s出现的次数 统计该字符串中子串 is 出现的次数 统计该字符串中单词 is 出现的次数 实现该字符串的倒序输出 pu
  • BT5, depends* but it is not going to be installed 解决方法

    apt get install 任何包都缺少依赖项 执行以下命令 apt get f install 然后在 apt get install package package 你要安装的包 比如我安装的open vm tools 就成功了 后
  • VSCode代码自动补全(html标签、style样式、css属性及值)

    转自 传送门 1 按CTRL SHIFT P 2 输入搜索Suggest Snippets Prevent Quick Suggestions 控制在活动代码片段内是否禁用快速建议 3 取消选中 4 按CTRL SHIFT P输入搜索 Fi
  • 利用cygwin编译cholmod以获得在windows上可用的库lib

    原文http blog parlin me complie cholmod to get library for win64 记录要点 cygwin好好装 希望哪位神人能够提供一个好用的cygwin国内mirror 编译cholmod的时候
  • 同源策略与跨域

    前言 最近业务上前端同学多次联系说访问腾讯云cos资源的时候因为跨域的问题访问不到 大致看了下腾讯云关于设置跨域访问的教程 按照前端同学给的域名等选项就给配了 而且测试下来也是好的 但是呢一直不知道什么是跨域这里就做一个简单的学习记录 一
  • 批量给多台Android手机安装APK脚本

    问题场景 测试让开发给4台手机安装测试版的APK 现实跑4次程序 于是该程序说 要是有个一次性安装多台手机APK的方法就好了 于是该脚本就出现了 并且还可以安装多个apk 以上是2个apk同时给2台设备安装 一键即可 把需要安装的apk放到
  • 百度AI接口测试案列一:车牌识别

    1 打开百度AI网站 百度AI网站 2 登录百度账号 进入控制台 选择文字识别服务 如图 3 点击立即使用 然后创建应用 之后输入应用名称 描述 随便写 并选择应用类型 之后点击 立即创建 按钮 创建完毕 点击 返回应用列表 如下图 注 A
  • linux删除文件_Linux中如何删除常用方式无法删除的文件

    前言 我们都知道 在linux删除一个文件可以使用rm命令 但是有一些特殊名称的文件使用普通的rm方式却没法删除 本文介绍linux中删除特殊名称文件的多种方式 linux文件命名规则 在介绍之前 简单说明一下linux中文件命名规则 文件
  • RegExp正则表达式-基本语法

    RegExp 百度云资料 密码 f89c 里面有详细的语法跟例子 希望对大家有帮助 课前补充 转义字符 多行字符串 字符串换行符 n RegExp作用 匹配特殊字符或有特殊搭配原则的字符的最佳选择 创建方式 直接量 推荐 new RegEx
  • Python 装饰器深入解析

    1 什么是装饰器 装饰器是给现有的模块增添新的小功能 可以对原函数进行功能扩展 而且还不需要修改原函数的内容 也不需要修改原函数的调用 1 1 装饰器的使用符合了面向对象编程的开放封闭原则 开放封闭原则主要体现在两个方面 对扩展开放 意味着
  • [LeetCode]4 两个有序数组的中位数

    Median of Two Sorted Arrays 两个有序数组的中位数 难度 hard There are two sorted arrays nums1 and nums2 of size m and n respectively