LeetCode题解——两个有序数组的中值

本文详细解析了如何在O(log(min(m, n)))的时间复杂度内找到两个已排序数组nums1和nums2的中位数。通过在[imin, imax]范围内搜索满足条件的i,确保nums2[j-1] <= nums1[i]和nums1[i-1] <= nums2[j],从而找到中位数。最后,文章提供了Python实现代码,并分析了时间复杂度和空间复杂度。" 7515199,1142499,OpenStack软件下载与安装指南,"['OpenStack', '服务器', 'CentOS', 'Python', '脚本']
摘要由CSDN通过智能技术生成

4.Median of Two Sorted Arrays

描述

有两个排序的数组 nums1nums2,它们的大小分别是 mn

找到两个排序数组的中值。程序的时间复杂度为 O(log(m+n))

你可以认为 nums1nums2 不会同时为空。

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

方法

为了解决这个问题,我们需要明白“中值可以用来做什么”。在统计学里,中值被用来:

将一个集合划分成两个等长的子集,其中一个子集的元素总是比另一个大。

如果我们理解了划分中值的意义,我们就可以很好地理解答案了。

首先将 nums1 在随机位置 i 分成两部分:

			left_nums1       		|          right_nums1

nums1[0], nums1[1], ..., nums1[i-1] | nums1[i], nums1[i+1], ..., nums1[m-1]

因为 nums1m 个元素,所以有 m+1 种划分法(i = 0~m)。

而且我们知道:

len(left_nums1) = i, len(right_nums1) = m - i.

Note: when i = 0, left_nums1 is empty, and when i = m, right_A is empty.

同样的,将 nums2 在随机位置 j 分成两部分:

	left_nums2							|		right_nums2
nums2[0], nums2[1], ..., nums2[j-1]		|	nums2[j], nums2[j+1], ..., nums2[n-1]

left_nums1left_nums2 放在一个集合并将 right_nums1right_nums1放在另一个集合。让我们命名为 left_partright_part

	left_part							|		right_part
nums1[0], nums1[1], ..., nums1[i-1]		|	nums1[i], nums1[i+1], ..., nums2[n-1]
nums2[0], nums2[1], ..., nums2[j-1]		|	nums2[j], nums2[j+1], ..., nums2[n-1]

我们可以确定:

1.len(left_part) = len(right_part)

2.max(left_part) <= min(right_part)

之后我们划分所有在 {nums1, nums2} 的元素到两个等长的集合,其中一个集合的元素总是比另一个大。

m e d i a n = m a x ( l e f t p a r t ) + m i n ( r i g h t p a r t ) 2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值