【LeetCode】修炼之路-0004-Median of Two Sorted Arrays【python】

news2024/10/10 7:48:39

题目

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 += 1
        else:
            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//2
    return (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)) / 2

    def findKthElement(self, nums1: List[int], nums2: List[int], k: int) -> float:
        index1, index2 = 0, 0
        current = 0
        
        for _ in range(k):
            if index1 == len(nums1):
                current = nums2[index2]
                index2 += 1
            elif index2 == len(nums2):
                current = nums1[index1]
                index1 += 1
            elif nums1[index1] < nums2[index2]:
                current = nums1[index1]
                index1 += 1
            else:
                current = nums2[index2]
                index2 += 1
        
        return 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.coloradmin.cn/o/2201467.html

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

相关文章

java.lang.NoClassDefFoundError: kotlin/Result解决方案

问题 在控制窗口上虽然报错是找不到对应的class&#xff0c;但是呢在我们导入kotlin的后&#xff0c;还是报相同的异常&#xff0c;在网上查找了各种资料&#xff0c;都没有解决方案。 问题分析 在idea2021之后&#xff0c;kotlin都使用远程仓库&#xff08;kotlinx-coeouti…

选择 PDF 编辑器时要考虑什么?如何选择适用于 Windows 10 的 PDF 编辑器

选择 PDF 编辑器时要考虑什么&#xff1f; 随着技术的出现&#xff0c;您在网上浏览时肯定会遇到一些 PDF 软件。但是&#xff0c;选择PDF 编辑器时需要考虑什么&#xff1f;如果您是重度用户并将在您的工作场所使用它&#xff0c;建议您找到专业、使用方便且能够帮助您完成任…

记一次pyc逆向

.py文件   源代码文件。   这是开发者编写的 Python 源代码文件&#xff0c;包含了可执行的 Python 代码。 .pyc文件   字节码文件。   Python 源文件&#xff08;.py&#xff09;在执行时会被编译为字节码&#xff0c;并存储在 __pycache__ 目录下&#xff0c;文件名通…

Linux下编译Eclipse Paho库采用MQTT协议连接MQTT服务器

一、Eclipse Paho介绍 Eclipse Paho 是一个开源项目&#xff0c;由 Eclipse Foundation 主持&#xff0c;提供可靠的开源实现来处理 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;协议以及其他与物联网 (IoT) 相关的协议。MQTT 是一种轻量级的发布/订阅消…

SQL进阶技巧:Order by 中 NULLS LAST特性使用?

目录 1 需求描述 2 数据准备 3 问题分析 4 小结 如果觉得本文对你有帮助&#xff0c;想进一步学习SQL语言这门艺术的&#xff0c;那么不妨也可以选择去看看我的博客专栏 &#xff0c;部分内容如下&#xff1a; 数字化建设通关指南 专栏 原价99&#xff0c;现在活动价59…

k8s的安装和部署

配置三台主机&#xff0c;分别禁用各个主机上的swap&#xff0c;并配置解析 systemctl mask swap.target swapoff -a vim /etc/fstab配置这三个主机上的主机以及harbor仓库的主机 所有主机设置docker的资源管理模式为system [rootk8s-master ~]# vim /etc/docker/daemon.json…

k8s、prometheus、grafana数据采集和展示的链路流程

k8s集群中&#xff0c;容器级别的数据采集是由cAdvisor程序实现 cAdvisor # Container Advisor 容器顾问 cAdvisor程序是kubelet组件的一部分。 每个节点&#xff0c;包括master节点&#xff0c;都有一个kubelet系统服务&#xff0c; kukelet负责管理pod和容…

PCB在导出gerber文件时过孔盖油设置方法

目前主要使用两个电路设计软件&#xff0c;一个是Altium Designer 15.0版本&#xff0c;一个是cadence17.2版本。在设计完PCB以后需要导出加工文件发给PCB加工厂进行制板打样&#xff0c;其中需要注意的一点是过孔盖油设置。有的制板厂在提交工艺要求时写上过孔盖油即可&#x…

学习Ultralytics(data)(1)

今天我们来学习一下data文件夹下面的代码 首先有个_init_文件&#xff0c;典型的 Python 包中的 __init__.py 文件&#xff0c;用于导出 Ultralytics YOLO 项目中的一些重要类和函数。它将 base.py, build.py, 和 dataset.py 文件中的内容导入并暴露给外部使用。 看看里面有什…

息肉检测数据集 yolov5 yolov8适用于目标检测训练已经调整为yolo格式可直接训练yolo网络

息肉检测数据集 yolov5 yolov8 适用于目标检测训练 已经调整为yolo格式 可直接训练yolo网络 息肉检测数据集介绍 数据集概述 名称&#xff1a;息肉检测数据集&#xff08;基于某公开的分割数据集调整&#xff09;用途&#xff1a;适用于目标检测任务&#xff0c;特别是内窥镜…

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

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

Redis-缓存过期淘汰策略

缓存淘汰策略 生产上redis内存设置为多少 设置为最大内存的 3/4 redis 会占用物理机多少内存 默认大小是 0&#xff0c;64 位系统下表示不限制内存大小&#xff0c;32位系统表示 3G 如何设置修改redis内存大小 config get maxmemory 查看修改方式 配置文件 单位是字节 2.…

读数据工程之道:设计和构建健壮的数据系统04数据工程生命周期(下)

1. 获取 1.1. 在了解数据源、所用源系统的特征以及数据的存储方式之后&#xff0c;你需要收集数据 1.2. 数据工程生命周期的下一阶段是从源系统中获取数据 1.2.1. 源系统和获取代表了数据工程生命周期中最重要的瓶颈 1.2.2. 源系统通常不在你的直接控制范围内&#xff0c;可…

性能测试工具locust —— Python脚本参数化!

1.1.登录用户参数化 在测试过程中&#xff0c;经常会涉及到需要用不同的用户登录操作&#xff0c;可以采用队列的方式&#xff0c;对登录的用户进行参数化。如果数据要保证不重复&#xff0c;则取完不再放回&#xff1b;如可以重复&#xff0c;则取出后再返回队列。 def lo…

算法修炼之路之位运算

目录 一:位运算符及一些常用结论总结 1.给一个数n&#xff0c;确定它的二进制表示中的第x位是0还是1(位数从右向左0开始增加) 2.将一个数n的二进制表示形式的第x位修改成1 3.将一个数n的二进制表示的第x位修改为0 4.提取一个数n的二进制表示中最右侧的1 5.干掉一个数n的…

使用Android studio进行Unit Test中遇到的问题记录

1、模块本身代码运行不起来 提示&#xff1a; Cannot resolve method ‘getVolumes’ in ‘StorageManager’ Cannot resolve method ‘registerListener’ in ‘StorageManager’ Cannot resolve method ‘unregisterListener’ in ‘StorageManager’ 查看Android 源码&…

p20 docker自己commit一个镜像 p21 容器数据卷 p22mysql同步数据(国内镜像被封锁暂时往后放)p23具名挂载和匿名挂载

如何自己commit一个镜像 这里还是先引用一下老师的笔记 关于如何自己commit一个镜像这个问题目前因为从仓库中拉下来的Tomcat里面是没有项目的&#xff0c;所以把webapps.dist里面的拷贝到webapps里面去作为自己的镜像在commit一下 这里用Tomcat举例子首先把镜像拉取下来执…

C语言 | Leetcode C语言题解之第468题验证IP地址

题目&#xff1a; 题解&#xff1a; char * validIPAddress(char * queryIP) {int len strlen(queryIP);if (strchr(queryIP, .)) {// IPv4int last -1;for (int i 0; i < 4; i) {int cur -1;if (i 3) {cur len;} else {char * p strchr(queryIP last 1, .);if (p…

读懂RAG理论到实践

目录 LLM面临的问题RAG数据准备阶段检索生成阶段 RAG实战数据准备阶段数据提取数据清洗补充&#xff1a;去除停用词 分块&#xff08;Chunking&#xff09;分块的方法固定大小分块Sentence splitting&#xff08;句分割&#xff09;递归分割 补充&#xff1a;特殊分块 向量化&a…

Java项目实战II基于Java+Spring Boot+MySQL的作业管理系统设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在教育信息…