4. 寻找两个正序数组的中位数

本文分享了一种使用双指针技巧在LeetCode中求解两个有序数组合并后的中位数的C++解决方案,通过递归与循环实现,适用于查找第k小的元素。

题目链接:leetcode.

这个题也做过的,印象中是用递归,每次减去小的那个数组的前m个,详见题解

/*
执行用时:40 ms, 在所有 C++ 提交中击败了68.50%的用户
内存消耗:86.9 MB, 在所有 C++ 提交中击败了65.08%的用户
*/
class Solution {
    //不递归,用循环就可以的
    int getMSA(vector<int>& nums1, vector<int>& nums2, int k)
    {
        int M = nums1.size(), N = nums2.size();
        int index1 = 0, index2 = 0;
        while(true)
        {
            //先判断特殊情况
            if(index1 == M)
            {
                return nums2[index2 + k - 1];
            }
            if(index2 == N)
            {
                return nums1[index1 + k - 1];
            }
            //要记得先判断越界,再判断特殊情况
            if(k == 1)
            {
                return nums1[index1] < nums2[index2] ? nums1[index1] : nums2[index2];
            }
            //再判断正常情况
            int t = k / 2 - 1;//减1是因为要确保index指向的数不会是中位数
            int i = min(index1 + t, M - 1);//防止超出范围
            int j = min(index2 + t, N - 1);
            if(nums1[i] < nums2[j])
            {
                //抛掉nums1的前面部分
                k -= (i - index1 + 1);
                index1 = i + 1;
            }
            else
            {
                //抛掉nums2的前面部分
                k -= (j - index2 + 1);
                index2 = j + 1;
            }
        }
    }
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int M = nums1.size(), N = nums2.size();
        int k = (M + N) / 2;
        if((M + N) % 2 == 0)
        {
            return (getMSA(nums1, nums2, k) + getMSA(nums1, nums2, k+1)) / 2.0;
        }
        else
        {
            return getMSA(nums1, nums2, k + 1);
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值