type
status
date
slug
summary
tags
category
icon
password
leetcode04
寻找两个正序数组的中位数
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的中位数。
- 进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
示例 1:
示例 2:
示例 3:
示例 4:
示例 5:
提示:
一个简化的版本
之前在刷考研题的时候遇到了该问题的简化版,两个数组的长度是相同的,在这里两个数组长度不相同。
首先尝试套用之前的解法:
1. 分别求出两个数组A,B的中位数a,b 2. 若a>b则去掉A中较大的一半,去掉B中较小的一半 3. 若a<b则去掉A中较小的一半,去掉B中较大的一半 4. 循环以上操作,直到两个序列中只含一个元素 5. 两数组长度相等,从而求a,b的平均值即可 ## 原题 在上面的基础上,思想不变,依旧是二分,但是考虑两个数组长度不同这一变化。
本质上来讲,如果我们把两个数组归并成一个,那么在数组的前半段一定小于后半段,并且该数组前半段中A中元素与B中元素个数之和与后半段A中元素个数与B中元素个数之和相等。从而如果我们记合成数组长度为m,半长度为k = (m + 1)/2(此处加一,利用/的特性避免奇偶判断),记A中含有m1个,B中含有m2个,m1+m2=k.
从而我们只用确定m1即可。利用上面的二分法,用left,right记录左右区间,找到m1,然后对奇偶进行判断,分别求出中位数。
### 代码
- 作者:VON
- 链接:https://baisihan.asia/article/f7d3de60-b26b-48fa-adda-c292ab81d87f
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。