【leetcode】4.寻找两个正序数组的中位数(二分查找,划分数组等多种方法,java实现)

本文介绍了两种寻找两个正序数组中位数的方法:一是使用二分查找,通过比较数组中点元素逐步缩小搜索范围,达到O(log(m+n))的时间复杂度;二是尝试探讨更优的时间复杂度解决方案,利用中位数的划分特性来解决。
摘要由CSDN通过智能技术生成
4. 寻找两个正序数组的中位数

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1nums2

请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1nums2 不会同时为空。

示例 1:

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

则中位数是 2.0

示例 2:

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

则中位数是 (2 + 3)/2 = 2.5

方法一:二分查找

image-20200726211918948

fig1

image-20200726211929348

用一个例子说明上述算法。假设两个有序数组如下:

A: 1 3 4 9
B: 1 2 3 4 5 6 7 8 9

两个有序数组的长度分别是 4 和 9,长度之和是 13,中位数是两个有序数组中的第 7 个元素,因此需要找到第 k=7 个元素。

比较两个有序数组中下标为 k / 2 − 1 = 2 k/2-1=2 k/21=2 的数,即 A[2] 和 B[2],如下面所示:

A: 1 3 4 9
       ↑
B: 1 2 3 4 5 6 7 8 9
       ↑

由于A[2]>B[2],因此排除B[0] 到B[2],即数组 B 的下标偏移(offset)变为 3,同时更新 k的值:k=k-k/2=4

下一步寻找,比较两个有序数组中下标为 k/2-1=1 的数,即 A[1] 和B[4],如下面所示,其中方括号部分表示已经被排除的数。

A: 1 3 4 9
     ↑
B: [1 2 3] 4 5 6 7 8 9
             ↑

由于A[1]<B[4],因此排除 A[0] 到 A[1],即数组A 的下标偏移变为 2,同时更新 k 的值:k=k-k/2=2。

下一步寻找,比较两个有序数组中下标为 k/2-1=0 的数,即比较 A[2] 和 B[3],如下面所示,其中方括号部分表示已经被排除的数。

A: [1 3] 4 9
         ↑
B: [1 2 3] 4 5 6 7 8 9
           ↑

由于A[2]=B[3],根据之前的规则,排除 A 中的元素,因此排除 A[2],即数组A 的下标偏移变为 3,同时更新 k 的值: k=k-k/2=1。

由于 k 的值变成 1,因此比较两个有序数组中的未排除下标范围内的第一个数,其中较小的数即为第 k 个数,由于 A[3]>B[3],因此第 k 个数是 B[3]=4。

A: [1 3 4] 9
           ↑
B: [1 2 3] 4 5 6 7 8 9
           ↑
class Solution {
   
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
   
        int length1 = nums1.length, length2 = nums2.length;
        int totalLength = length1 + length2;
        if (totalLength % 2 ==
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值