Leetcode—4.寻找两个正序数组的中位数【困难】

2023每日刷题(二十九)

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

在这里插入图片描述

直接法实现代码

int mid, mid1, mid2;
bool findmid(int n, int k, int x) {if(n % 2 == 1) {if(k == n / 2) {mid = x;return true;}} else {if(k == n / 2 - 1) {mid1 = x;} else if(k == n / 2) {mid2 = x;return true;}}return false;
}double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {int n = nums1Size + nums2Size;int i = 0, j = 0, k = 0;bool flag = false;while(i < nums1Size && j < nums2Size) {if(nums1[i] < nums2[j]) {flag = findmid(n, k, nums1[i]);if(flag) {break;}i++;} else {flag = findmid(n, k, nums2[j]);if(flag) {break;}j++;}k++;}while(i < nums1Size && !flag) {flag = findmid(n, k, nums1[i]);k++;i++;}while(j < nums2Size && !flag) {flag = findmid(n, k, nums2[j]);k++;j++;}if(n % 2 == 1) {return mid;} else {return (mid1 + mid2) / 2.0;}
}

运行结果

在这里插入图片描述

优化代码

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {int n = nums1Size + nums2Size;int mid1 = 0, mid2 = 0;int i = 0, j = 0, k = 0;while((i < nums1Size || j < nums2Size) && k <= n / 2) {if((j >= nums2Size) || (i < nums1Size && nums1[i] <= nums2[j])) {if(k == n / 2) {mid1 = nums1[i];} else if(k == n / 2 - 1) {mid2 = nums1[i];}i++;}else {if(k == n / 2) {mid1 = nums2[j];} else if(k == n / 2 - 1) {mid2 = nums2[j];}j++;}k++;}if(n % 2 == 1) {return mid1;} else {return (mid1 + mid2) / 2.0;}
}

运行结果

在这里插入图片描述

二分法算法思想——降低时间复杂度到题目要求的 O ( l o g ( m + n ) ) O(log(m + n)) O(log(m+n))

其实就是第 k 小数解法,详情参考这篇文章
在这里插入图片描述

二分法实现代码

#define MIN(a, b) ((a < b) ? (a): (b))
int binaryKth(int* nums1, int nums1Size, int* nums2, int nums2Size, int k) {int idx1 = 0, idx2 = 0;int newIdx1 = 0, newIdx2 = 0;int n1 = 0, n2 = 0;while(1) {if(idx1 == nums1Size) {return nums2[idx2 + k - 1];}if(idx2 == nums2Size) {return nums1[idx1 + k - 1];}if(k == 1) {return MIN(nums1[idx1], nums2[idx2]);}newIdx1 = MIN(idx1 + k / 2 - 1, nums1Size - 1);newIdx2 = MIN(idx2 + k / 2 - 1, nums2Size - 1);n1 = nums1[newIdx1];n2 = nums2[newIdx2];if(n1 <= n2) {k -= newIdx1 - idx1 + 1;idx1 = newIdx1 + 1;} else {k -= newIdx2 - idx2 + 1;idx2 = newIdx2 + 1;}}
}double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {int n = nums1Size + nums2Size;if(n % 2 == 1) {return binaryKth(nums1, nums1Size, nums2, nums2Size, (n + 1) / 2);} else {int a = binaryKth(nums1, nums1Size, nums2, nums2Size, n / 2);int b = binaryKth(nums1, nums1Size, nums2, nums2Size, n / 2 + 1);return (a + b) / 2.0;}
}

运行结果

在这里插入图片描述
之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】Ubuntu16.04系统查看已安装的python版本,及其配置

前情提示&#xff1a;我已经在Ubuntu16.04里用源码安装了python3.8.11&#xff0c;Ubuntu16.04系统默认安装2.7.12与3.5.2 1.查看已安装版本 python2 --version #查看python2安装版本 python3 --version #查看python3安装版本 python3.5 --version #查看python3.5安装…

【C++】:STL——标准模板库介绍 || string类

&#x1f4da;1.什么是STL STL(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架 &#x1f4da;2.STL的版本 原始版本 Alexander Stepanov、Meng Lee 在…

基于 Redis 实现的分布式锁

获取锁 互斥&#xff1a;确保只有一个线程获得锁 # 添加锁 利用setnx的互斥性 127.0.0.1:6379> setnx lock thread1释放锁 手动释放锁 超时释放&#xff1a;获取锁时设置一个超时时间 #释放锁 删除即可 127.0.0.1:6379> del lock两步合成一步 help setSET key value …

hive里因为列名用了关键字导致建表失败

代码 现象 ParseException line 6:4 cannot recognize input near percent String COMMENT in column name or primary key or foreign key 23/11/13 11:52:57 ERROR org.apache.hadoop.hive.ql.Driver: FAILED: ParseException line 6:4 cannot recognize input near percent …

Linux C 进程编程

进程编程 进程介绍进程的定义进程和线程以及程序的区别进程块PCB进程的状态相关指令 进程调度算法先来先服务调度算法 FCFS短作业(进程)优先调度算法 SJF优先权调度算法 FPF优先权调度算法的类型非抢占式优先权算法抢占式优先权算法 优先权类型静态优先权动态优先权 高响应比优…

MQ四大消费问题一锅端:消息不丢失 + 消息积压 + 重复消费 + 消费顺序性

RabbitMQ-如何保证消息不丢失 生产者把消息发送到 RabbitMQ Server 的过程中丢失 从生产者发送消息的角度来说&#xff0c;RabbitMQ 提供了一个 Confirm&#xff08;消息确认&#xff09;机制&#xff0c;生产者发送消息到 Server 端以后&#xff0c;如果消息处理成功&#xff…

MySQL 人脸向量,欧几里得距离相似查询

前言 如标题&#xff0c;就是通过提取的人脸特征向量&#xff0c;写一个欧几里得 SQL 语句&#xff0c;查询数据库里相似度排前 TOP_K 个的数据记录。做法虽然另类&#xff0c;业务层市面上有现成的面部检索 API&#xff0c;技术层现在有向量数据库。 用 MySQL 关系型存储 128 …

C语言 每日一题 牛客网 11.13 Day17

找零 Z国的货币系统包含面值1元、4元、16元、64元共计4种硬币&#xff0c;以及面值1024元的纸币。 现在小Y使用1024元的纸币购买了一件价值为N(0 < N≤1024)的商品&#xff0c;请问最少他会收到多少硬币&#xff1f; 思路 运用if语句进行判断分类 代码实现 int main() {…

执行力太差的人,如何才能提高执行力?

执行力是计划的落地执行&#xff0c;是按照计划稳步推进&#xff0c;导向结果的能力。不同的人&#xff0c;其执行力有很大的差别。比如说有拖延症的人&#xff0c;基本上是谈不上执行力的&#xff0c;执行力是一个综合体&#xff0c;是多个要素的共同作用。 在企业HR人才测评…

【左程云算法全讲10】打表技巧和矩阵处理技巧

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于左程云算法课程进行的&#xff0c;每个知识点的修正和深入主要参考…

Java进阶(垃圾回收GC)——理论篇:JVM内存模型 垃圾回收定位清除算法 JVM中的垃圾回收器

前言 JVM作为Java进阶的知识&#xff0c;是需要Java程序员不断深度和理解的。 本篇博客介绍JVM的内存模型&#xff0c;对比了1.7和1.8的内存模型的变化&#xff1b;介绍了垃圾回收的语言发展&#xff1b;阐述了定位垃圾的方法&#xff0c;引用计数法和可达性分析发以及垃圾清…

使用阿里云服务器学习Docker

首先我这里选择的系统服务器是CentOS 7.9 64位 因为centos系统里面的安装指令是&#xff1a;yum,而非apt-get. yum install docker -y试着建立一个容器&#xff1a; docker run -d -p 80:80 httpd启动docker的守护进程&#xff1a; sudo systemctl start docker 查看Docke…