发布于: 2023-3-8最后更新: 2024-8-2字数 00 分钟

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,然后对奇偶进行判断,分别求出中位数。 ### 代码

Loading...