LeetCode.Problem 4 Median of Two Sorted Arrays

本文介绍了一种使用二分查找算法寻找两个已排序数组中位数的方法,该算法的时间复杂度为O(log(m+n))。通过定义查找第k个元素的辅助函数并结合分治思想,实现了对中位数的有效计算。

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

问题还是可以的,因为时间要求是O(Log(m+n)),所以我第一个想法就是分治。那对于查找的话,就是采取二分查找。习惯了数组,为了改成容器还花了一阵时间。上代码。
class Solution {
public:
double findKth(vector<int>& A, vector<int>& B, int A_st, int B_st, int k) {
        int A_key,B_key;
        if (A_st>=A.size()) {
            return B[B_st + k - 1];
        }
        if (B_st>=B.size()) {
            return A[A_st + k - 1];
        }
        if (k == 1) return min(A[A_st], B[B_st]);
        if(A_st+k/2-1>=A.size())  A_key=INT_MAX;
        else  A_key=A[A_st+k/2-1];
        if(B_st+k/2-1>=B.size())  B_key=INT_MAX;
        else  B_key=B[B_st+k/2-1];
        if (A_key < B_key){
            return findKth(A, B, A_st + k / 2, B_st, k - k / 2);
        } else {
            return findKth(A, B, A_st, B_st + k / 2, k - k / 2);
        }

    }
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int sum = nums1.size() + nums2.size();
        double r;
        if (sum%2==1) {
            r = findKth(nums1, nums2, 0, 0, sum / 2 + 1);
        } else {
            r = ((findKth(nums1, nums2, 0, 0, sum / 2)) +
                    findKth(nums1, nums2, 0, 0, sum / 2 + 1)) / 2.0;
        }
        return r;
    }
};
第一个函数就是很简单的二分查找,查找第k个数。
第二个函数引用了第一个函数,用来计算中位数,区分有奇数个数和偶数个数的情况。
vector和数组的区别在于,第一个函数,数组传入的是size,而容器操作迭代器更为方便一些。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值