算法/编程练习:两个有序数组的中位数

2024-09-04 18:32

本文主要是介绍算法/编程练习:两个有序数组的中位数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

算法/编程练习:两个有序数组的中位数

题目来自LeetCode:
https://leetcode-cn.com/problems/median-of-two-sorted-arrays/

题目:

给定两个大小为 n1 和 n2 的有序(升序)数组 nums1 和 nums2 ,
找出这两个有序数组的中位数mid。
要求算法的时间复杂度为 O(log(m + n))。
例如,
输入:  nums1 = [1, 3, 5, 7, 9],  nums2 = [2, 4, 6, 8, 10, 11]
输出:  mid=6

思路:

记总的数组长度为 N = n1 + n2,则两个数组中小于等于mid的数有 N_lef = int(N/2)个 。
假设用索引 idx1 将 nums1 分为左右两部分,用索引 idx2 将 nums2 分为左右两部分,
若此时 nums1 和nums2的左边部分共同构成 mid 的左边,
nums1 和 nums2 的右边部分共同构成 mid 的右边,
那么 idx1 和 idx2 应满足等量约束 idx2 + idx1 + 1 = N_left。
根据中位数的定义,nums1 左边部分的最大值不能大于 num2 右边部分的最小值,
nums2 的切分同理。
因此只需要从 nums1 的最大索引开始遍历,找出 合适的 idx1 和 idx2 即可。  即:
# idx1把nums1分为左右两部分:
nums1_left = nums1[0:idx1+1]
nums1_right = nums1[idx1+1:]
# idx2把nums2分为左右两部分:
nums2_left = nums2[0:idx2]
nums2_right = nums2[idx2:]
# 能正确划分nums1和nums2从而找到mid的idx1和idx2应满足
idx2 = N_left - (idx1+1) # 且
nums1[idx1] <= nums2[idx2]

Python代码:

def Find2OrderedListMid(nums1, nums2):if not isinstance(nums1, list) or not isinstance(nums2, list):print('请输入两个列表!')return None​n1, n2 = len(nums1), len(nums2)N = n1 + n2N_left = int(N/2) # 合并数列中,中位数前面的数的个数odd = False if N % 2 == 0 else True# 代码简化处理,不考虑有数组长度为0的情况下if n1 == 0 or n2 == 0:print('需要保证两个数组的长度均大于0!')return None​​# 保持nums1的长度小于等于nums2if n1 > n2:nums1, nums2 = nums2, nums1n1, n2 = len(nums1), len(nums2)​idx1 = n1-1idx2 = N_left - (idx1+1)# 注意这里idx2的最大取值为n2-1,原因在于限制了n1 <= n2while nums1[idx1] > nums2[idx2] and idx1 > -1 and idx2 < n2-1:idx1 -= 1idx2 += 1if odd:    # odd为True时有两种情况:nums1的数全分配到左边或左右都有# (由于odd为True时必有n1<n2,因此nums2的数不可能全部分配到左边)if idx1 == n1-1: # nums1的数全分配到左边mid = nums2[idx2]else:mid = min(nums1[idx1+1], nums2[idx2])else:# odd为False时计算左边部分最大值,有三种情况if idx1 == -1: # nums1的数全部分配到右边max_left = nums2[idx2-1]elif idx2 == 0: # nums2的数全部分配到右边max_left = nums1[idx1]else:max_left = max(nums1[idx1], nums2[idx2-1])# odd为False时计算右边最小值,有两种情况# (由于N为偶数且n1 <= n2,因此当nums2的数全部分配到左边时,实际上n1 == n2,#  计算中位数时也要取nums2最后一个值)if idx1 == n1-1: # nums1的数全分配到左边min_right = nums2[idx2]else:min_right = min(nums1[idx1+1], nums2[idx2])​mid = (max_left + min_right) / 2return mid
​
​
if __name__ == '__main__':    nums1 = [1, 3, 5, 7, 9]nums2 = [2, 4, 6, 8, 10, 11]print(Find2OrderedListMid(nums1, nums2))

欢迎关注公众号:一本正经d胡说
Genlovy562

这篇关于算法/编程练习:两个有序数组的中位数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136698

相关文章

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Python 异步编程 asyncio简介及基本用法

《Python异步编程asyncio简介及基本用法》asyncio是Python的一个库,用于编写并发代码,使用协程、任务和Futures来处理I/O密集型和高延迟操作,本文给大家介绍Python... 目录1、asyncio是什么IO密集型任务特征2、怎么用1、基本用法2、关键字 async1、async

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的