今日打卡,Leetcode第四题:寻找两个正序数组的中位数,博主表示就会sorted

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

博主只会第一个暴力解法,然后将官网上的源码上添加些注释,尝试理解,分下今日刷题记录

题目描述

给定两个大小分别为 mn 的正序(从小到大)数组 nums1nums2。请你找出并返回这两个正序数组的 中位数

算法的时间复杂度应该为 O(log (m+n))

解法一:暴力合并法(不符合题目要求的时间复杂度)

这种方法最为直观,但时间复杂度为 O((m+n)log(m+n)),不符合题目要求。

class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:nums = sorted(nums1 + nums2)  # 合并并排序两个数组n = len(nums)result = 0for i in range(n):result += nums[i]return result / n  # 这里实际上计算的是平均值而非中位数,正确的中位数计算应为:# 如果n为奇数,返回nums[n//2]# 如果n为偶数,返回(nums[n//2-1] + nums[n//2])/2

注意:上述代码中计算的是平均值而非中位数。正确的中位数计算应该是:

if n % 2 == 1:return nums[n//2]
else:return (nums[n//2-1] + nums[n//2]) / 2

解法二:二分查找法(符合题目要求的时间复杂度)

这种方法的核心思想是将"寻找中位数"转化为"寻找第k小的元素"的问题。

class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:def getKthElement(k):"""- 主要思路:要找到第 k (k>1) 小的元素,那么就取 pivot1 = nums1[k/2-1] 和 pivot2 = nums2[k/2-1] 进行比较- 这里的 "/" 表示整除- nums1 中小于等于 pivot1 的元素有 nums1[0 .. k/2-2] 共计 k/2-1 个- nums2 中小于等于 pivot2 的元素有 nums2[0 .. k/2-2] 共计 k/2-1 个- 取 pivot = min(pivot1, pivot2),两个数组中小于等于 pivot 的元素共计不会超过 (k/2-1) + (k/2-1) <= k-2 个- 这样 pivot 本身最大也只能是第 k-1 小的元素- 如果 pivot = pivot1,那么 nums1[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums1 数组- 如果 pivot = pivot2,那么 nums2[0 .. k/2-1] 都不可能是第 k 小的元素。把这些元素全部 "删除",剩下的作为新的 nums2 数组- 由于我们 "删除" 了一些元素(这些元素都比第 k 小的元素要小),因此需要修改 k 的值,减去删除的数的个数"""index1, index2 = 0, 0  # 初始化两个数组的起始索引while True:# 特殊情况处理if index1 == m:  # m是数组num1的长度,如果nums1已经全部被排除return nums2[index2 + k - 1]  # 直接返回nums2中的第k个元素if index2 == n:  #n是数组num2的长度 如果nums2已经全部被排除return nums1[index1 + k - 1]  # 直接返回nums1中的第k个元素if k == 1:  # 如果要找第1小的元素return min(nums1[index1], nums2[index2])  # 返回两个数组当前位置的最小值# 正常情况处理newIndex1 = min(index1 + k // 2 - 1, m - 1)  # 计算nums1中的比较位置,防止越界newIndex2 = min(index2 + k // 2 - 1, n - 1)  # 计算nums2中的比较位置,防止越界pivot1, pivot2 = nums1[newIndex1], nums2[newIndex2]  # 取出比较值# 比较两个数组的元素,排除较小元素所在的部分if pivot1 <= pivot2:  # 如果nums1的元素较小k -= newIndex1 - index1 + 1  # 更新k值,减去排除的元素个数index1 = newIndex1 + 1  # 更新nums1的起始位置else:  # 如果nums2的元素较小k -= newIndex2 - index2 + 1  # 更新k值,减去排除的元素个数index2 = newIndex2 + 1  # 更新nums2的起始位置m, n = len(nums1), len(nums2)  # 获取两个数组的长度totalLength = m + n  # 计算总长度# 根据总长度的奇偶性,计算中位数if totalLength % 2 == 1:  # 如果总长度为奇数return getKthElement((totalLength + 1) // 2)  # 返回中间的元素else:  # 如果总长度为偶数return (getKthElement(totalLength // 2) + getKthElement(totalLength // 2 + 1)) / 2  # 返回中间两个元素的平均值

详细解释

二分查找法的核心思想

  1. 问题转化:中位数可以转化为找第k小的元素

    • 如果总长度为奇数,中位数是第(m+n+1)/2小的元素
    • 如果总长度为偶数,中位数是第(m+n)/2小和第(m+n)/2+1小的元素的平均值
  2. 二分排除法:每次比较两个数组中第k/2个元素,排除较小值所在数组的前k/2个元素

算法流程图解

假设有两个数组:

  • nums1 = [1, 3, 5, 7, 9]
  • nums2 = [2, 4, 6, 8, 10]

要找这两个数组合并后的中位数:

  1. 总长度为10,是偶数,需要找第5小和第6小的元素的平均值
  2. 寻找第5小的元素:
    • 比较nums1[5/2-1]=nums1[1]=3和nums2[5/2-1]=nums2[1]=4
    • 3<4,排除nums1的[1,3],k=3,nums1现在从索引2开始
    • 比较nums1[3/2-1+2]=nums1[3]=7和nums2[3/2-1]=nums2[0]=2
    • 7>2,排除nums2的[2],k=2,nums2现在从索引1开始
    • 比较nums1[2/2-1+2]=nums1[2]=5和nums2[2/2-1+1]=nums2[1]=4
    • 5>4,排除nums2的[4],k=1,nums2现在从索引2开始
    • k=1,返回min(nums1[2], nums2[2])=min(5,6)=5
  3. 寻找第6小的元素(类似过程):结果为6
  4. 中位数=(5+6)/2=5.5

时间复杂度分析

  • 每次操作会排除k/2个元素
  • 总共有m+n个元素,最多需要log(m+n)次操作
  • 因此时间复杂度为O(log(m+n)),符合题目要求

空间复杂度分析

  • 只使用了常数级别的额外空间
  • 空间复杂度为O(1)

总结

  1. 暴力合并法:简单直观但不符合题目要求
  2. 二分查找法:通过每次排除一部分元素,达到O(log(m+n))的时间复杂度
  3. 关键在于将"寻找中位数"转化为"寻找第k小元素"的问题
  4. 通过比较两个数组中第k/2个元素,每次可以排除至少k/2个元素

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

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

相关文章

Jouier 普及组十连测 R3

反思 首先&#xff0c;先悔恨一下这次的比赛成绩。 这次比赛的教训就是&#xff0c;简单的题目一定要打不要被复杂的题面震慑到&#xff0c;以及变量名不能是保留字&#xff0c;如第一题的x1,y1&#xff0c;要开long long&#xff0c;计算好数据范围&#xff0c;如第三第四题。…

Open CASCADE学习|非线性方程组求解技术详解

引言 在几何建模与工程计算中&#xff0c;非线性方程组的求解是常见的核心问题。Open CASCADE&#xff08;以下简称OCC&#xff09;作为开源的几何建模内核&#xff0c;提供了丰富的数学工具库&#xff0c;其中math_FunctionSetRoot类专为求解非线性方程组设计。本文将深入探讨…

科技初创企业创新推动商业未来

在这个因变革而蓬勃发展的世界里&#xff0c;科技初创企业已成为各行业创新、颠覆与转型的驱动力。这些雄心勃勃的企业正在重塑商业格局&#xff0c;挑战既定规范&#xff0c;并不断突破可能性的边界。本文将深入探索科技初创企业的精彩领域&#xff0c;探讨它们如何通过创新塑…

霍尼韦尔HMR2300-D00-485数字模块

型号&#xff1a;HMR2300-D00-485 类型&#xff1a;数字通信模块&#xff08;RS-485接口&#xff09; 制造商&#xff1a;霍尼韦尔&#xff08;Honeywell&#xff09;&#xff0c;隶属于其工业自动化或楼宇自动化产品线。 典型用途&#xff1a; 用于扩展主控制器&#xff08;如…

如何在 Windows 11 或 10 上更改 WIFI 或以太网 MAC 地址?

无论你使用的是哪种操作系统,更改 MAC 地址在各种场景中都有其益处。每个网卡的 MAC 地址都是唯一的,由网络适配器在出厂时就已经分配完成;它帮助系统在物理网络上进行通信,并为其提供身份识别。然而,如果你出于某种合法原因想要更改 Windows 上的当前 MAC 地址,那么我们…

Python语法特点与编码规范

注释 单行注释 把#号当做注释符号 多行注释 python中并没有规定多行注释标记&#xff0c;通常使用单引号作为多行注释 中文注释 规定文件所用编码&#xff0c;当时是为解决python2不支持中文的问题 #codingutf-8代码缩进 python采用代码缩进和冒号区分代码层次&#xff0c…

跟Gemini学做PPT:字号选择

字号的选择对于 PPT 的可读性和视觉效果至关重要。以下是一些通用的建议和针对你具体情况的字号选择指南&#xff1a; 通用字号选择原则&#xff1a; 对比度&#xff1a; 文字颜色与背景颜色形成高对比度&#xff0c;确保易读。字体&#xff1a; 选择清晰、专业的字体&#x…

【JVM 03-JVM内存结构之-虚拟机栈】

虚拟机栈 笔记记录 1. 定义1.1 演示栈帧 2. 特点3. 线程运行诊断3.1 案例1 cpu占用过多&解决3.2 案例2 程序运行很长时间没有结果 4. 拓展知识&问题辨析4.1 栈的内存越大越好嘛&#xff1f;(不是)4.2 方法内的局部变量是否线程安全&#xff1f;(是线程安全的)4.2.1 局部…

文章记单词 | 第104篇(六级)

一&#xff0c;单词释义 keyboard /ˈkiːbɔːrd/ n. 键盘underlying /ˌʌndərˈlaɪɪŋ/ adj. 潜在的&#xff1b;根本的&#xff1b;基础的June /dʒuːn/ n. 六月tactics /ˈtktɪks/ n. 战术&#xff1b;策略&#xff1b;手段south /saʊθ/ n./adj./adv. 南方&#x…

中宏立达与天空卫士达成战略合作

战略合作篇 中宏立达-天空卫士 2025年5月23日&#xff0c;中宏立达与天空卫士在中宏立达集团总部北京丽金智地中心正式签署战略合作协议。中宏立达总经理王博先生与天空卫士高级副总裁兼首席运营官巩文坚先生代表双方签署协议。这标志着两家领军企业在数字安全领域的深度合作正…

RxJS 高阶映射操作符详解:map、mergeMap 和 switchMap

1. map 操作符 map 是最基本的转换操作符&#xff0c;用于对 Observable 发出的每个值进行一对一转换。 基本特点&#xff1a; 同步操作一对一转换不改变 Observable 的发出时机 详细示例&#xff1a; import { of } from rxjs; import { map } from rxjs/operators;// 示…

基于stm32的多旋翼无人机(Multi-rotor UAV based on stm32)

由于一直在调试本项目&#xff0c;好久没有发文章&#xff0c;最近本项目的PID调试初见成效&#xff01;开始正文前首先感谢各位粉丝的支持&#xff0c;以及对本项目技术上支持的老师以及师兄&#xff0c;谢谢你们&#xff01; 对应源码及文件&#xff1a;源码及文件下载 基于…

量子传感器:开启微观世界的精准探测

随着量子技术的飞速发展&#xff0c;量子传感器逐渐成为前沿科技领域的热门研究方向。量子传感器利用量子力学的特性&#xff0c;能够实现对物理量的极高精度测量&#xff0c;其应用范围涵盖了基础科学研究、医学诊断、环境监测以及国防安全等多个领域。本文将深入探讨量子传感…

河道管网排口在线监测系统解决方案

一、方案概述 我国作为世界上河流数量最为丰富的国家之一&#xff0c;拥有众多历史悠久的壮阔江河流域。然而&#xff0c;伴随经济社会的迅猛发展&#xff0c;河湖管理与保护面临诸多新挑战&#xff0c;诸如河道干涸、湖泊萎缩、水环境恶化以及河湖功能退化等问题&#xff0c;对…

Foldseek快速蛋白质结构比对

1. 下载和安装 Foldseek 如果只是单个蛋白质结构的序列比对&#xff0c;我们只需要用Foldseek 的网站服务 https://search.foldseek.com/search 上传我们的蛋白质结构并选择想要进行比对的数据库即可&#xff0c;这里不做重点讲解。做生物信息学研究&#xff0c;我们难免需要批…

宏山激光韩国釜山开放日圆满举行,服务本地化再提速

5月21日-22日&#xff0c;宏山激光在韩国釜山展厅举办了主题为“韩国本地服务领导者”的开放日活动&#xff0c;此次活动聚焦韩国市场&#xff0c;通过沉浸式参观和深度交流&#xff0c;全面展示宏山激光本地化服务体系的建设成果&#xff0c;彰显其服务本地、深耕市场的坚定决…

大模型「瘦身」指南:从LLaMA到MobileBERT的轻量化部署实战

大模型「瘦身」指南&#xff1a;从LLaMA到MobileBERT的轻量化部署实战 系统化学习人工智能网站&#xff08;收藏&#xff09;&#xff1a;https://www.captainbed.cn/flu 文章目录 大模型「瘦身」指南&#xff1a;从LLaMA到MobileBERT的轻量化部署实战摘要引言一、轻量化技术…

JavaScript篇:函数作用域与作用域链探秘

大家好&#xff0c;我是江城开朗的豌豆&#xff0c;一名拥有6年以上前端开发经验的工程师。我精通HTML、CSS、JavaScript等基础前端技术&#xff0c;并深入掌握Vue、React、Uniapp、Flutter等主流框架&#xff0c;能够高效解决各类前端开发问题。在我的技术栈中&#xff0c;除了…

Robust Kernel Estimation with Outliers Handling for Image Deblurring论文阅读

Robust Kernel Estimation with Outliers Handling for Image Deblurring 1. 论文的研究目标与实际问题意义1.1 研究目标1.2 实际问题与产业意义2. 论文的创新方法、模型与优势2.1 核心思路2.2 关键公式与技术细节2.2.1 非线性模糊模型与能量函数2.2.2 中间潜像更新与IRLS2.2.3…

nginx配置跨域请求,后台不用配置啦,完美

允许全部把域名改* server { listen 22222; server_name localhost; location / { if ($request_method OPTIONS) { add_header Access-Control-Allow-Origin http://localhost:8080; add_header Access-Control-Allow-Headers *; add_header Access-Control-…