NC36—在两个长度相等的排序数组中找到上中位数

本文介绍了一种高效算法,用于找出两个有序数组的上中位数,采用二分查找法实现O(logN)的时间复杂度,并确保额外空间复杂度为O(1)。

题意

给定两个有序数组arr1arr2,已知两个数组的长度都为 N,求两个数组中所有数的上中位数

上中位数:假设递增序列长度为 n,若 n 为奇数,则上中位数为第 n/2+1 个数,否则为第n/2个数

[要求]

时间复杂度为O(logN)O(logN)O(logN),额外空间复杂度为O(1)O(1)O(1)

题解

要求时间复杂度为O(logN)O(logN)O(logN),很容易想到二分查找,关键是怎么二分

  1. 如果每个数组中只有一个元素,较小的那个元素就是整体的上中位数,如果两个元素相等,随便返回哪个都可以。

  2. 如果数组中不止一个元素,找到两个数组的中间位置mid1和mid2。

  3. 如果arr1[mid1] == arr2[mid2],不管每个数组中元素的个数是奇数还是偶数,这两个数都可以是整体的上中位数,返回其中一个就可以。

  4. 如果arr1[mid1] > arr2[mid2],每个数组的个数是奇数的情况下:数组arr1中mid1位置以后的数都不可能是整体的上中位数,数组arr2中mid2位置以前的数都不可能是整体的上中位数。所以现在只需要考虑arr1[left1…mid1]、arr2[mid2…right],这两部分的元素个数相同,它们的上中位数就是整体的上中位数。

  5. 如果arr1[mid1] > arr2[mid2],每个数组的个数是偶数的情况下:数组arr1中mid1位置以后的数都不可能是整体的上中位数,数组arr2中mid2位置以后包括mid2位置,都不可能是整体的上中位数。所以现在只需要考虑arr1[left1…mid1]、arr2[mid2+1…right],这两部分的元素个数相同,它们的上中位数就是整体的上中位数。

  6. arr1[mid1] < arr2[mid2]的情况,分析同上。

class Solution {
public:
    /**
     * find median in two sorted array
     * @param arr1 int整型vector the array1
     * @param arr2 int整型vector the array2
     * @return int整型
     */
    int findMedianinTwoSortedAray(vector<int>& arr1, vector<int>& arr2) {
        int end1 = arr1.size()-1;
        int end2 = arr2.size()-1;
        int start1 = 0, start2 = 0;
        int mid1, mid2;
        while(start1 < end1){
            mid1 = (start1 + end1)/2;
            mid2 = (start2 + end2)/2;
            // 如果有序数组是偶数,偏移量为1,否则为0
            int offset = (end1-start1+1)&1^1;
            if(arr1[mid1] == arr2[mid2]){
                return arr1[mid1];
            }
            else if(arr1[mid1] < arr2[mid2]){
                start1 = mid1 + offset;
                end2 = mid2;
            }
            else{
                end1 = mid1;
                start2 = mid2 + offset;
            }
        }
        return min(arr1[start1], arr2[start2]);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值