leetcode 4 寻找两个正序数组的中位数 元素排除+二分分块 全三种做法

该博客探讨了三种解决LeetCode第4题的方法,包括依次排除元素、一次排除多个元素以及利用二分查找确定分隔位置。重点在于边界条件的处理和优化策略,旨在找到两个正序数组中位数的高效解决方案。
摘要由CSDN通过智能技术生成

做法1:O(N+M)做法为一次排除一个元素,

做法2:一次排除k个元素。
做法为,如果中位数的位置是k,说明它前面有mid个元素。咱们希望能排出mid/2个元素。当不需要排出元素时,说明他前面要么有一个元素,要么没有元素。
咱们让中位数的位置等于第二个中位数(如果是偶数),防止碰不到他。
由于咱们每次排出一半的元素,到最后前面一定会剩一个元素,所以第一个中位数是一定可以取到的。当剩余要排的只有一个元素时,咱们取4个元素,就保证都能搞到了。
这里用分治做,可以避免循环,也挺好的。

class Solution {
   
public:
    // nums1.size <= nums2.size
    double divide_conquer(vector<int>& nums1, vector<int>& nums2, int p1, int p2)
    {
   
        // 计算要删除的元素个数
        int mid_pos = (nums1.size() + nums2.size())/2; //靠右的中位数位置
        int k = (mid_pos-p1-p2)/2;
        
        // 处理一个数组完全切掉的情况
        if(p1 >= nums1.size())
        {
   
            int l = (nums2.size()-nums1.size())/2, r =  (nums2.size()-nums1.size()-1)/2;
            return (nums2[l] + nums2[r])/2.0;
        }

        // 如果k = 0,返回中位数
        if(k == 0)
        {
   
            vector<int> v;
            int s1 = min<int>(2, nums1.s
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值