分治法求解中位数

该博客讨论了一种寻找两个有序数组中位数的算法。通过不断调整分割线位置,找到分割线使得两边元素数量相等或相差1,从而确定中位数。算法适用于奇数和偶数个元素的情况,确保了在较短数组中查找分割线,提高了效率。

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

来先上代码: 

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
           
            if(nums1.size() > nums2.size()){ //如果nums1的长度大于nums2,则交换
                return findMedianSortedArrays(nums2,nums1);
            }

            int len1 = nums1.size();
            int len2 = nums2.size();

            //分割线左边的元素的个数,如果是奇数我们让左边的个数多一个
            int total_left = (len1 + len2 + 1) / 2; //向下取整

            //我们在长度小的那个数组里找分割线,那么长度大的一定含有分割线
            //[0,len1]
            int left  =  0;
            int right =  len1;

            //我们是不是要确定 left 和 right 的位置呀
            //我们在这层循环里只寻妖考虑短的那一边 [0,len1]-->在这里面找分割线
            while(left < right){
                int i = left + (right - left + 1)/2;   //从中间开始-->第一个数组里去的个数
                int j = total_left - i;         //从第二个数组里取的个数

                if(nums1[i - 1] > nums2[j]){
                    right = i - 1;      //那么分割线所在的区间一定为[0,i-1]
                }else{
                    left = i;
                }

            }

            //判断结果
            int i = left;  //-->第一个数组里分割线左边的个数
            int j = total_left - i; //-->第二个数组里分割线左边的个数
            //第一个数组左边最小的和右边最大的
            int nums1LeftMax = i== 0  ? INT_MIN : nums1[i - 1];
            int nums1RightMin = i== len1 ? INT_MAX : nums1[i];
            //第二个数组左边最小的和右边最大的
            int nums2LeftMax = j== 0  ? INT_MIN : nums2[j - 1];
            int nums2RightMin = j== len2 ? INT_MAX : nums2[j];

            if((len1 + len2) % 2 == 0){ //偶数个-->左边最大的和右边最小的和
                int ans1 = max(nums1LeftMax,nums2LeftMax);
                int ans2 = min(nums1RightMin,nums2RightMin);
                return double((ans1 + ans2)/2.0);
            }else{//奇数个-->左边最大大的
                return (double)max(nums1LeftMax,nums2LeftMax);
            }

    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@陈一言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值