| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> leetcode 热题100 4. 寻找两个正序数组的中位数 -> 正文阅读 |
|
[数据结构与算法]leetcode 热题100 4. 寻找两个正序数组的中位数 |
题目给定两个大小分别为? 一、思路:使用二分查找使用一条分割线把两个数组分别分割成两个部分: 划分分割线时应同时满足的条件是:(1)两个元素个数之和为偶数时:红线左边和右边元素个数相等;为奇数时:红线左边元素的个数比右边元素的个数多1 (ps:也可以右边比左边多1,看自己怎么定义) (2)红线左边所有元素的数值<=红线右边所有元素的数值 如果满足以上两个条件,则两个数组的中位数就跟一个数组的中位数性质相等,即中位数就一定只与红线两侧的元素有关,确定这条红线的位置使用二分查找 具体而言: 满足以上两个条件的前提下,如果数组个数之和为奇数,则红线左边最大的元素为中位数 如果满足以上两个条件的前提下,如果数组个数之和为偶数,则(红线左边最大的元素+红线右边最小的元素)/2=中位数 ? 二、具体实现1、实现条件(1) 假设数组1的长度为m,数组2的长度为n。 当m+n为偶数时,红线左边的元素个数为(m+n)/2 = (m+n+1)/2 当m+n为奇数时,红线左边的元素个数为(m+n+1)/2 因此,可以将以上两种写法合并,记为=(m+n+1)/2,这样写的好处就是只需要确定其中一个数组的分割线位置,另一个数组的分割线位置可以通过公式推导出来。 2、实现条件(2) 我们主要是需要保证交叉小于等于关系成立,即第一个数组红线左边的第一个元素要<=第二个数组红线右边的第一个元素? and? 第二个数组红线左边的第一个元素<=第一个数组红线右边的第一个元素。 如果不满足上面交叉小于等于关系的话,那么我们就需要适当调整分割线的位置 以下为不满足条件(2)的两种情况 问题:第二个数组红线左边第一个元素>第一个数组红线右边第一个元素 解决方法:第一个数组红线右移,第二个数组红线左移 ?问题:第一个数组红线左边的第一个元素>第二个数组红线右边的第一个元素 解决方法:第二个数组红线右移,第一个数组红线左移 3、几种特殊情况 ? 三、代码?
? ?
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 18:54:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |