LeetCode #4 - Median of Two Sorted Arrays

本文介绍了一种高效算法,用于查找两个已排序数组的中位数,通过二分法实现O(log(m+n))的时间复杂度。适用于不同长度的数组,包括特殊情况处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

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


此题为hard难度,需要满足时间复杂度为O(log(m+n)),所以应该采用二分法。由于两个数组是有序的,可以令k=(m+n)/2,比较两个数组的前k/2个元素,如果nums1[k/2-1]>nums2[k/2-1],可以确定在nums1的0到(k/2-1)共k/2个元素中,必定不存在两个数组的中位数,可以直接除去这k/2个元素,反之同理。然后进行递归,求剩下两个数组的第k/2个元素,相当于是对k进行了二分,所以时间复杂度为O(log(m+n)),当k=1时即可直接求解。同时还要注意一些例外的情况,比如当一个数组元素为空时,就直接求另外一个数组的第k个元素即可,还有就是如果一个数组元素个数小于k/2时,直接取这个数组最后一个元素和另一个数组进行比较。这种方法不止对求两个有序数组的中位数有效,求任意第k个值都可以。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m=nums1.size();
        int n=nums2.size();
        if((m+n)%2==1)
            return findKth(nums1,nums2,(m+n)/2+1);
        else return (findKth(nums1,nums2,(m+n)/2)+findKth(nums1,nums2,(m+n)/2+1))/2;
    }
    
    double findKth(vector<int> nums1, vector<int> nums2, int k)
    {
        int m=nums1.size();
        int n=nums2.size();
        if(m==0)
            return nums2[k-1];
        else if(n==0)
            return nums1[k-1];
        if(k==1)
            return min(nums1[0],nums2[0]);  
        
        int i=min(m,k/2);
        int j=min(n,k/2);
        
        if(nums1[i-1]>nums2[j-1])
        {
            vector<int> nums(nums2.begin()+j,nums2.end());
            return findKth(nums1,nums,k-j);
        }
        else if(nums1[i-1]<=nums2[j-1])
        {
            vector<int> nums(nums1.begin()+i,nums1.end());
            return findKth(nums2,nums,k-i);
        }
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值