【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函数开始时,index1index2 都是 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位
这部分看最佳实践就好了,相关代码应该很多,看看后续补档有空再来更新这部分

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

SPIE出版-EI会议-人机交互 虚拟现实 <<< 11月杭州

EI、Scopus检索|人机交互与虚拟现实国际会议征稿进行中❗会议已通过SPIE出版❗ 2024人机交互与虚拟现实国际会议 ✅大会时间&#xff1a;2024年11月15-17日 ✅大会地点&#xff1a;中国-杭州 ✅报名/截稿&#xff1a;2024年10月15日&#xff08;团队投稿可享优惠&#xff…

实现std::sort,replace,fill,accumulate,equal等函数

std::sort /// <summary>/// std::sort 是从小到大排列的/// </summary>/// <typeparam name"IteratorClass"></typeparam>/// <typeparam name"ComparingFunctions"></typeparam>/// <param name"itBegin&qu…

基于IDEA+SpringBoot+Vue+Uniapp的投票评选小程序系统的详细设计和实现

2. 详细视频演示 文章底部名片&#xff0c;联系我获取更详细的演示视频 3. 论文参考 4. 项目运行截图 代码运行效果图 代码运行效果图 代码运行效果图 代码运行效果图 代码运行效果图 5. 技术框架 5.1 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框…

大数据毕业设计选题推荐-B站热门视频数据分析-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

AI助力农作物自动采摘,基于嵌入式端超轻量级模型LeYOLO全系列【n/s/m/l】参数模型开发构建作物生产场景下番茄采摘检测计数分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物&#xff0c;专家设计出来了很多用于采摘不同农作物的大型机械&#xff0c;看着非常震撼&#xff0c;但是我们国内农业的发展还是相对比较滞后的&#xff0…

计算机的错误计算(一百一十八)

摘要 探讨一个不动点的计算精度问题。 不动点是一类特殊的循环迭代。它有形式 例1. 已知迭代[1] 计算 显然&#xff0c;每个 均为 0.5 . 不妨在Visual Studio 2010 下用下列C语言代码计算&#xff1a; #include <stdio.h> #include <math.h>int main() {do…

【大语言模型-论文速读】GPT的不确定性判断

【大语言模型-论文精读】GPT’s Judgements Under Uncertainty Authors: Payam Saeedi and Mahsa Goodarzi 论文&#xff1a;https://arxiv.org/pdf/2410.02820 文章标题翻译 GPT的不确定性判断 Payam Saeedi Rochester Institute of Technology Mahsa Goodarzi The State …

【exp报错注入】

整数范围 最大整数 exp 函数介绍 报错盲注注入 payload分析 709C-ASCII 值就等于我们下面的 7091-1 &#xff0c;C就是我们要猜的值&#xff0c;当我们猜测的值和ASCII码相等时&#xff0c;那么exp就不会出现报错&#xff0c;因为1-1还是等于709&#xff1a; 练习 id1 an…

【AIGC】OpenAI API在快速开发中的实践与应用:优化ChatGPT提示词Prompt加速工程

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;使用最新型号确保最佳实践利用最新模型进行高效任务处理为什么要选择最新模型&#xff1f;结论 &#x1f4af;指令与上下文的分隔最佳实践分隔指令和上下文的重要性使用符…

Win32 API 控制台鼠标操作、坐标获取与相关函数介绍

Win32 API 控制台鼠标操作、坐标获取与相关函数介绍 一、前置介绍读取控制台输入缓冲区数据 ReadConsoleInput 函数控制台输入缓冲区中的输入事件 INPUT_RECORD 结构鼠标输入事件 MOUSE_EVENT_RECORD 结构更改输入模式 SetConsoleMode 函数 二、鼠标坐标获取(以下代码环境为 VS…

PCL 3D-SIFT关键点检测(Z方向梯度约束

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 SIFT关键点检测 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长期更新&#…

SQL优化 where谓词条件OR优化

1.测试表&#xff0c;及测试语句where条件中OR对应两个字段选择度很高 create table t618 as select * from dba_objects; select object_name from t618 where (object_id12043 or DATA_OBJECT_ID12043) and STATUSVALID; 2.没有索引情况下&#xff0c;全表扫描逻辑读…

C++核心编程和桌面应用开发 第九天(静态多态 动态多态 纯虚函数 抽象类 虚析构 纯虚析构 向上向下类型转换 重载重写重定义)

目录 1.1静态多态 1.2动态多态 1.2.1满足条件 1.2.2动态多态的使用条件 1.3纯虚函数和抽象类 1.3.1纯虚函数 1.3.2抽象类 1.4虚析构/纯虚析构 1.5向上向下类型转换 1.5.1向下类型转换 1.5.2向上类型转换 1.5.3多态中的类型转换 1.6重载重写重定义 1.6.1重载 1.6…

qwt实现码流柱状图多色柱体显示

qwt实现码流柱状图多色柱体显示 1. 前言2. qt实现柱状图3.qwt基础说明3.1 qwt安装与使用3.1.1 下载qwt源码3.1.2 编译3.1.3 安装3.1.4 使用3.2 QwtPlotBarChart类3.2.1画图步骤3.2.2 specialSymbol3.3.3 barTitle4 BsBarChart定制4.1 每个柱体可以显示不同的颜色4.2 每个柱体可…

MFC项目如何使用hiredis库连接redis

如何在windows平台使用c连接redis 1. 下载hiredis的vs工程文件2. 使用vs2022编译hiredis3.项目中调用4. 集群连接5. 简单的封装下 最近需要在windows PC终端读取redis数据。我这里使用hiredis连接redis. 工程是vs2022开发的。 1. 下载hiredis的vs工程文件 windows平台需要自己…

【C/C++】错题记录(七)

题目一 题目二 C在调用函数时&#xff0c;当实参和形参的数据类型不一致时&#xff0c;会发生数据类型转换&#xff01;将低精度转换为高精度时&#xff0c;由编译器隐式完成&#xff1b;将高精度转换为低精度时&#xff0c;必须用强制类型转换运算符&#xff1b; static_cast…

Redis:分布式 - 哨兵

Redis&#xff1a;分布式 - 哨兵 概念哨兵 Docker 搭建哨兵分布式选举流程 概念 Redis 的主从复制模式下&#xff0c;一旦主节点由于故障不能提供服务&#xff0c;需要人工进行主从切换&#xff0c;同时大量的客户端需要被通知切换到新的主节点上&#xff0c;对于上了一定规模…

浏览器动态移动的小球源码分享

浏览器动态移动的小球源码分享 <script>(function(a){var width100,height100,borderRadius100,circlefunction(){};circle.prototype{color:function(){let colour "#"Math.floor(Math.random()*255).toString(16)Math.floor(Math.random()*255).toString…

Linux块设备驱动实验

直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 本文仅作为个人笔记使用&#xff0c;方便进一步记录自己的实践总结。 前面我们都是在学习字符设备驱动&#xff0c;本章我们来学习一下块设备驱动框架&#xff0c;块设备驱动是Linux 三大驱动类型之一。块设备驱动要远…

Fiddler配合wireshark解密ssl

环境&#xff1a; win11&#xff08;wireshark&#xff09;--虚拟机win7&#xff08;Fiddler&#xff09;---虚拟机win7&#xff08;HTTPS站点&#xff09; 软件安装问题&#xff1a; 需要.net环境&#xff0c;NDP461-KB3102436-x86-x64-AllOS-ENU.exe。 安装fiddler后安装下…