LeetCode Hot100【4. 寻找两个正序数组的中位数】

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

自己做 

分析

解1:归并思想

class Solution {
public:double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int sum = 0;double value;queue<double> value2;int i = 0, j = 0;if ((nums1.size() + nums2.size()) % 2 == 1) {                 //两数组大小相加为奇数【只有一个中位数】while (i < nums1.size() && j < nums2.size()) {if (nums1[i] < nums2[j]) {value = nums1[i];           //相当于取nums1[i]i++;}else {value = nums2[j];           //相当于取nums2[j]j++;}sum++;if (sum == (nums1.size() + nums2.size()) / 2 + 1)        //找到中位数return value;}while (i < nums1.size()) {        //遍历完其中一个数组还没有找到value = nums1[i];           //相当于取nums1[i]i++;sum++;if (sum == (nums1.size() + nums2.size()) / 2 + 1)        //找到中位数return value;}while (j < nums2.size()) {        //遍历完其中一个数组还没有找到value = nums2[j];           //相当于取nums2[j]j++;sum++;if (sum == (nums1.size() + nums2.size()) / 2 + 1)        //找到中位数return value;}}else {                               //两数组大小相加为偶数【需要合并】while (i < nums1.size() && j < nums2.size()) {if (nums1[i] < nums2[j]) {value2.push(nums1[i]);           //相当于取nums1[i]i++;if (value2.size() > 2)             //只维护两个数据value2.pop();}else{value2.push(nums2[j]);           //相当于取nums2[j]j++;if (value2.size() > 2)             //只维护两个数据value2.pop();}sum++;if (sum == (nums1.size() + nums2.size()) / 2 + 1) {        //找到中位数double num1 = value2.back();double num2 = value2.front();value = (num1 + num2) / 2;return value;}}while (i < nums1.size()) {        //遍历完其中一个数组还没有找到value2.push(nums1[i]);           //相当于取nums1[i]i++;if (value2.size() > 2)             //只维护两个数据value2.pop();sum++;if (sum == (nums1.size() + nums2.size()) / 2 + 1) {        //找到中位数double num1 = value2.back();double num2 = value2.front();value = (num1 + num2) / 2;return value;}}while (j < nums2.size()) {        //遍历完其中一个数组还没有找到value2.push(nums2[j]);           //相当于取nums2[j]j++;if (value2.size() > 2)             //只维护两个数据value2.pop();sum++;if (sum == (nums1.size() + nums2.size()) / 2 + 1) {        //找到中位数double num1 = value2.back();double num2 = value2.front();value = (num1 + num2) / 2;return value;}}}return 0;}
};

思考

看题解【想不到】

总结:使用二分我们可以直接排除不可能是中位数的数

仿写

class Solution {
public:int getKthElement(const vector<int>& nums1, const vector <int>& nums2, int k) {     //寻找中位数(位置为k)对应元素int index1 = 0, index2 = 0;         //两数组的中位索引int len1 = nums1.size();            //注:nums1.size()返回的是无符号整型,这一步就是为了将无符号整型转化为有符号int len2 = nums2.size();while(true) {if(index1 == len1)          //nums1为空数组return nums2[index2 + k - 1];   //直接返回nums2的第k个元素【即Nums2的中位数就是两者合并的中位数】if (index2 == len2)          //nums2为空数组return nums1[index1 + k - 1];   //直接返回nums1的第k个元素【即Nums1的中位数就是两者合并的中位数】if (k == 1) {                //将中位数前面的数全部排除后,k = 1,这个数即是中位数return min(nums1[index1], nums2[index2]);   //排除的过程中,会不断移动Index,当k=1时即只剩下了中位数,这种情况下就代表了前k-1个数已经完全排除了,第k个数即为中位数,也是剩余数中最小的}//正常情况,平分k/2int newIndex1 = min(index1 + k / 2 - 1, len1 - 1);          //偏移中轴位置int newIndex2 = min(index2 + k / 2 - 1, len2 - 1);          //偏移中轴位置int pivot1 = nums1[newIndex1];int pivot2 = nums2[newIndex2];if (pivot1 <= pivot2) {              //数组1的中位比数组2的中位小k -= newIndex1 - index1 + 1;    //排除index1 = newIndex1 + 1;}else {k -= newIndex2 - index2 + 1;    //排除index2 = newIndex2 + 1;}} }double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int totalLen = nums1.size() + nums2.size();if (totalLen % 2 == 1)           //总长为奇数return getKthElement(nums1, nums2, (totalLen + 1) / 2);else                            //总长为偶数return (getKthElement(nums1, nums2, totalLen / 2) + getKthElement(nums1, nums2, totalLen / 2 + 1))/ 2.0;}};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/603.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JobSet:Kubernetes 分布式任务编排的统一解决方案

JobSet–Kubernetes 分布式任务编排的统一解决方案 在 Kubernetes 生态中&#xff0c;分布式机器学习训练和高性能计算&#xff08;HPC&#xff09;工作负载的编排一直是技术难点。随着大语言模型&#xff08;LLM&#xff09;等大型 AI 模型的兴起&#xff0c;单主机资源已无法…

【电脑】显示器的基础知识

显示器是计算机系统中用于显示图像、文本和其他视觉内容的重要组件。它将电子信号转化为可见的图像&#xff0c;使用户可以直观地查看和操作数据。以下是关于显示器的一些详细知识&#xff1a;1. 显示器的基本类型CRT显示器&#xff08;阴极射线管显示器&#xff09;工作原理&a…

【删库跑路】一次删除pip的所有第三方库

进入命令行&#xff0c;先list看下库存pip list导出所有的第三方库至一文件列表pip freeze >requirements.txt按照列表卸载所有库pip uninstall -r requirements.txt -y再list看下&#xff0c;可见库存已清空

19.如何将 Python 字符串转换为 Slug

如何将 Python 字符串转换为 Slug(URL 友好格式) 什么是 Slug? Slug 是一种 URL 友好、便于人类阅读的字符串。只包含小写字母、数字和连字符(-)。常见于文章标题、商品名等生成的网址路径中。例如: "Hello World!" → "hello-world"1. Slugify 的…

3.2数据库-关系代数-函数依赖-范式

1、关系代数基础1、并U&#xff1a;记录合并&#xff0c;相同记录只显示一次2、交&#xff1a;两张表都有的记录。3、差&#xff1a;S1-S2 表示S1减去S2中也有的数据。笛卡尔积&#xff08;重要&#xff09;1、笛卡尔积&#xff1a;S1*S2 :列是所有列全部加起来&#xff0c;重复…

[ROS 系列学习教程] ROS动作通讯(Action):通信模型、Hello World与拓展

ROS 系列学习教程(总目录) ROS2 系列学习教程(总目录) 文章目录一、动作通讯模型二、动作通讯流程2.1 任务添加阶段2.2 任务执行阶段2.3 任务完成阶段三、Action Hello World3.1 创建并初始化功能包3.2 确定Action名称及消息格式3.3 配置编译文件3.4 实现服务端与客户端&#x…

【C++】初识C++(1)

个人主页&#xff1a;我要成为c嘎嘎大王 希望这篇小小文章可以让你有所收获&#xff01; 目录 前言 一、C的第一个程序 二、命名空间 2.1 namespace 的价值 2.2 namespace 的定义 2.2.1 正常的命名空间定义 2.2.2 命名空间可以嵌套 2.2.3 匿名命名空间 2.2.4 同名的name…

Spark Expression codegen

Expression codegen src/main/scala/org/apache/spark/sql/catalyst/expressions/Expression.scala def genCode(ctx: CodegenContext): ExprCode = {ctx.subExprEliminationExprs.get(ExpressionEquals(

02 51单片机之LED闪烁

文章目录1、单片机1-1、简介1-2、应用场景2、51单片机2-1、背景2-2、主要品牌及其产品2-3、基本组成2-4、命名规则3、单片机内部结构3-1、单片机内部结构图3-2、单片机内部结构3-3、单片机内部管脚图3-4、单片机最小系统3-5、开发板介绍4、点亮LED4-1、新建工程4-1-1、创建工程…

穿透、误伤与回环——Redis 缓存防御体系的负向路径与治理艺术

一、写在前面&#xff1a;当“防御”成为新的“攻击” 在构建 Redis 缓存防线时&#xff0c;我们往往陷入一个悖论&#xff1a;为了拦截 0.1% 的幽灵查询&#xff0c;引入了布隆过滤器、空值缓存、限流器&#xff0c;结果却让 5% 的正常请求被误杀&#xff0c;甚至引发更复杂的…

代理模式详解:代理、策略与模板方法模式

引言 设计模式是面向对象编程中的经典解决方案&#xff0c;它们封装了前人的经验&#xff0c;提供了可复用的设计思路。本文将重点介绍三种常用的设计模式&#xff1a;代理模式&#xff08;含静态代理、JDK动态代理、CGLIB代理&#xff09;、策略模式和模板方法模式&#xff0c…

Kotlin Map映射转换

Kotlin 集合转换&#xff1a;map、mapIndexed、mapNotNull、mapKeys、mapValues、flatten、flatMap 引言 在之前的主题中&#xff0c;我们学习了如何筛选&#xff08;filter&#xff09;和排序&#xff08;sort&#xff09;集合。然而&#xff0c;处理集合时最重要的任务之一是…