[leetcode]分治算法之Median of Two Sorted Arrays

该博客主要介绍了如何使用分治算法解决LeetCode中找到两个已排序数组的中位数问题。通过二分查找法,分别在两个数组中找到第K/2个最大元素,逐步缩小查找范围,最终确定中位数的位置。

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

分治算法之Median of Two Sorted Arrays

题干

leetcode入口

思想归类

中位数的计算:
假设第一个集合大小为size1,第二个为size2,
那么中位数可以是第 (size1+size2+1)/2(size1+size2+2)/2 这两个位置的值
利用分治法,求这两个位置的值。

二分法:
求两个有序数组中第K小的数组,对K进行二分
查找到nums1和nums2中第K/2大的数,淘汰掉较小的一个数组的K/2个数组(通过移动下标来实现)
如果数组大小小于K/2,那么淘汰掉另一个数组的K/2个数

代码

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int size1=nums1.size();
        int size2=nums2.size();
        
        //如果nums1和nums2的总数是奇数,那么下面这两个相等,否则不相等
        int left = (size1+size2+1)/2; //左边的数位置
        int right= (size1+size2+2)/2; //右边的数位置
        
        //此题变成了寻找两个有序数组中第K大的问题
        return ((double)divide_and_conquer(nums1,0,nums2,0,left)+divide_and_conquer(nums1,0,nums2,0,right))/2.0;
        
    }
    
    //i代表nums1的起始位置,j代表nums2的起始位置
    int divide_and_conquer(vector<int>& nums1,int i,vector<int>& nums2,int j,int K){
        //如果起始位置超过各个数组的大小,则在另一个数组中找
        if(i>=nums1.size()) return nums2[j+K-1];
        if(j>=nums2.size()) return nums1[i+K-1];
        if (K == 1) return min(nums1[i], nums2[j]);
		
		//分别找到第K/2个数字进行比较
        int mid1=((i+K/2-1)<nums1.size())?nums1[i+K/2-1]:INT_MAX;
        int mid2=((j+K/2-1)<nums2.size())?nums2[j+K/2-1]:INT_MAX;
        
        //如果淘汰较小数组的前K/2个
        if(mid1<mid2){
            return divide_and_conquer(nums1,i+K/2,nums2,j,K-K/2);
        }
        else{
            return divide_and_conquer(nums1,i,nums2,j+K/2,K-K/2);
        }
        
        
    }
    
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值