【LeetCode】修炼之路-0004-Median of Two Sorted Arrays【python】
题目
Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.
The overall run time complexity should be O(log (m+n)).
Example 1:
Input: nums1 = [1,3], nums2 = [2]
Output: 2.00000
Explanation: merged array = [1,2,3] and median is 2.
Example 2:
Input: nums1 = [1,2], nums2 = [3,4]
Output: 2.50000
Explanation: merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5.
思路
一根筋直觉
思路1:直觉,我应该把2个列表合并,通过数组长度n,定位到下标n/2
那我的代码可能需要几个部分呢
1.接收传进来的参数(刷leetcode的话,会发现官方函数定义,已经完成了这个工作,)

我们可以直接用nums1和nums2
2.合并在一起
这里我们定义一个merge函数,然后拿到两个列表的长度,用i和j去边比较,边合并。到循环结束的时候,merged.exted会加一个空的和剩下的那个长的。
def merge(self, nums1: List[int], nums2: List[int]) -> List[int]:merged = []i, j = 0, 0# 比较两个数组的元素并合并while i < len(nums1) and j < len(nums2):if nums1[i] <= nums2[j]:merged.append(nums1[i])i += 1else:merged.append(nums2[j])j += 1# 添加剩余的元素merged.extend(nums1[i:])merged.extend(nums2[j:])
oi, 我们用的是python啊
# 有sorted,直接帮我们排好了
merged = sorted(nums1 + nums2)
3.根据数组是奇数还是偶数,取中间的即可
n = len(merged)# 如果长度为奇数,返回中间元素
if n % 2 == 1:return merged[n // 2]
# 如果长度为偶数,返回中间两个元素的平均值
else:# 假如是1 2 3 4 n//2下标变成2,这个时候对应的是第3个数,所以,偶数是取n//2-1和n//2return (merged[n // 2 - 1] + merged[n // 2]) / 2
最后的莽夫代码:
class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:# 合并两个有序数组merged = sorted(nums1 + nums2)n = len(merged)# 如果长度为奇数,返回中间元素if n % 2 == 1:return merged[n // 2]# 如果长度为偶数,返回中间两个元素的平均值else:return (merged[n // 2 - 1] + merged[n // 2]) / 2
(怎么回事,我们的暴力算法这么快)

递归思想
思路2.其实我一开始就知道我要找的是第几位,我可以先找第一位,然后找第二位,然后找到第n位
这样我们需要实现一个查找第k个大的值的函数findKthElement()
然后主函数findMedianSortedArrays()需要做的事情就是根据总长度n是奇数还是偶数来决定需要找N//2+1或者找第N//2大的和第N/2+1大的值。
class Solution:def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:total = len(nums1) + len(nums2)if total % 2 == 1:return self.findKthElement(nums1, nums2, total // 2 + 1)else:return (self.findKthElement(nums1, nums2, total // 2) + self.findKthElement(nums1, nums2, total // 2 + 1)) / 2def findKthElement(self, nums1: List[int], nums2: List[int], k: int) -> float:index1, index2 = 0, 0current = 0for _ in range(k):if index1 == len(nums1):current = nums2[index2]index2 += 1elif index2 == len(nums2):current = nums1[index1]index1 += 1elif nums1[index1] < nums2[index2]:current = nums1[index1]index1 += 1else:current = nums2[index2]index2 += 1return current
findKthElement函数开始时,index1 和 index2 都是 0,表示我们从两个数组的开始位置开始。
我们用一个 for 循环来找第 k 个元素。每次循环,我们都会选择一个元素(第 1 个、第 2 个、…、直到第 k 个)。
在每次循环中:
如果 index1 == len(nums1),这意味着 nums1 已经用完了。我们只能从 nums2 中取元素。
如果 index2 == len(nums2),这意味着 nums2 已经用完了。我们只能从 nums1 中取元素。
如果两个数组都还有元素(一般状态),我们比较 nums1[index1] 和 nums2[index2],选择较小的那个。
每次我们选择一个元素后,我们就把它赋值给 current,并将相应的索引加 1。
当循环结束时,我们已经找到了第 k 个元素,它就是 current。
知识点:当 index 等于数组长度时,这就表示我们已经遍历完了这个数组。
例如,对于长度为 4 的数组:
开始时 index = 0,对应第 1 个元素
然后 index = 1,对应第 2 个元素
然后 index = 2,对应第 3 个元素
然后 index = 3,对应第 4 个元素
最后 index = 4,这时 index 等于数组长度,表示数组已经遍历完毕
提交后,唔,看上去还是有一点可取之处

有序就可以二分
思路3:我的两个列表是有序的,有序就可以二分,通过二分去更快地找第n位
这部分看最佳实践就好了,相关代码应该很多,看看后续补档有空再来更新这部分
相关文章:
【LeetCode】修炼之路-0004-Median of Two Sorted Arrays【python】
题目 Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays. The overall run time complexity should be O(log (mn)). Example 1: Input: nums1 [1,3], nums2 [2] Output: 2.00000 Explanation: merged…...
C++面试速通宝典——10
177. #include <filename> 和 #include "filname.h" 有什么区别? 对于 #include <filename> , 编译器从标准库路径开始搜索 filename.h。 对于 #include "filename.h,编译器从用户的工作…...
肺腺癌预后新指标:全切片图像中三级淋巴结构密度的自动化量化|文献精析·24-10-09
小罗碎碎念 本期这篇文章,我去年分享过一次。当时发表在知乎上,没有标记参考文献,配图的清晰度也不够,并且分析的还不透彻,所以趁着国庆假期重新分析一下。 这篇文章的标题为《Computerized tertiary lymphoid structu…...
基于jmeter+perfmon的稳定性测试记录
1. 引子 最近承接了项目中一些性能测试的任务,因此决定记录一下,将测试的过程和一些心得收录下来。 说起来性能测试算是软件测试行业内,有些特殊的部分。这部分的测试活动,与传统的测试任务差别是比较大的,也比较依赖…...
前沿论文 M5Product 组会 PPT
对比学习(Contrast learning):对比学习是一种自监督学习方法,用于在没有标签的情况下,通过让模型学习哪些数据点相似或不同来学习数据集的一般特征。假设一个试图理解世界的新生婴儿。在家里,假设有两只猫和…...
navicat~导出数据库密码
当我们mysql密码忘记了,而在navicat里有记录,我们应该如何导出这个密码呢? 第一步:文件菜单,导出链接,导出连接获取到 connections.ncx 文件 这里需要勾选 导出密码!!! 不然导出的文…...
【Java】 —— 数据结构与集合源码:Vector、LinkedList在JDK8中的源码剖析
目录 7.2.4 Vector部分源码分析 7.3 链表LinkedList 7.3.1 链表与动态数组的区别 7.3.2 LinkedList源码分析 启示与开发建议 7.2.4 Vector部分源码分析 jdk1.8.0_271中: //属性 protected Object[] elementData; protected int elementCount;//构造器 public …...
YOLOv5改进——添加SimAM注意力机制
目录 一、SimAM注意力机制核心代码 二、修改common.py 三、修改yolo.py 三、建立yaml文件 四、验证 一、SimAM注意力机制核心代码 在models文件夹下新建modules文件夹,在modules文件夹下新建一个py文件。这里为simam.py。复制以下代码到文件里面。 import…...
SQL 自学:表别名的运用与对被联结表使用聚集函数
一、表别名的概念与作用 (一)表别名的定义 表别名是为表指定的临时名称,在 SQL 查询中使用别名可以简化表名,提高代码的可读性和可维护性。当表名较长或在复杂的查询中多次引用表时,使用表别名可以避免重复输入冗长的…...
jmeter学习(2)变量
1)用户定义的变量 路径:添加-》配置元件-》用户定义的变量 用户定义的变量是全局变量,可以跨线程组被调用,但在启动运行时获取一次值,在运行过程中不再动态获取值。 注意的是,如果在某个线程组定义了全…...
【C#生态园】C#文件压缩库全面比较:选择最适合你的库
从核心功能到API概览:深度解析六大C#文件压缩库 前言 在软件开发过程中,文件的压缩和解压缩是一个常见的需求。针对C#开发者而言,选择合适的文件压缩库可以极大地简化开发工作。本文将介绍几个常用的C#文件压缩库,包括其核心功能…...
【测试】接口测试与接口自动化
壹、接口测试基础 一、接口测试概念 I、基础概念 是测试系统组件间接口的一种测试。 主要用于检测外部系统与系统间、内部子系统间的交互点;测试重点检查数据的交换、传递和控制管理过程,以及系统间的相互逻辑依赖关系。 内部接口调用相当于函数调用&am…...
Android设置边框圆角
在Android开发中,圆角设计十分常见,那么实现边框圆角有几种形式呢? 文章目录 设置圆角边框样式使用ClipToOutline进行裁切最后 设置圆角边框样式 常见的方式是在drawable文件夹下设置一个xml文件的边框样式,比如 <shape andro…...
SpringBoot项目打成jar包,在其他项目中引用
1、首先新建一个SpringBoot工程 记得要将Gradle换成Maven 2、新建一个要引用的方法 3、打包的时候要注意: ① 不能使用springboot项目自带的打包插件进行打包,下面是自带的: ②要换成传统项目的maven打包,如下图: 依…...
【音频可视化】通过canvas绘制音频波形图
前言 这两天写项目刚好遇到Ai对话相关的需求,需要录音功能,绘制录制波形图,写了一个函数用canvas实现可视化,保留分享一下,有需要的直接粘贴即可,使用时传入一个1024长的,0-255大小的Uint8Arra…...
解决github每次pull push输入密码问题
# 解决git pull/push每次都需要输入密码问题 git bash进入你的项目目录,输入: git config --global credential.helper store然后你会在你本地生成一个文本,上边记录你的账号和密码。配置项写入到 "C:\Users\用户名\ .gitconfig" …...
Java重修笔记 第六十四天 坦克大战(十四)IO 流 - 标准输入输出流、InputStreamReader 和 OutputStreamWriter
标准输入输出流 1. System.in 标准输入流 本质上是一个InputString,对应键盘,表示从键盘输入。 定义:public final static InputStream in null; 所以 Scanner scanner new Scanner(System.in); 会从键盘中获取数据 2. System.out 标准输…...
prctl的函数和pthread_self函数
1.prctl的函数原型如下: #include<sys/prctl.h> prctl(PR_SET_NAME, “process_name”);第一个参数是操作类型,指定PR_SET_NAME(对应数字15),即设置进程名; 第二个参数是进程名字符串,…...
Vim 命令行模式下的常用命令
Vim 命令行模式下的常用命令 文件操作: :w :保存当前文件。:w filename :将当前内容另存为指定的 filename 。:q :退出 Vim,如果文件有修改但未保存,会提示错误。:q! :强制退出 Vim,…...
【动态规划-最长递增子序列(LIS)】力扣2826. 将三个组排序
给你一个整数数组 nums 。nums 的每个元素是 1,2 或 3。在每次操作中,你可以删除 nums 中的一个元素。返回使 nums 成为 非递减 顺序所需操作数的 最小值。 示例 1: 输入:nums [2,1,3,2,1] 输出:3 解释: …...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
