leetcode 4 两个排序数组的中位数 C++

参考文章:1 https://blog.csdn.net/yutianxin123/article/details/52189127?utm_source=blogxgwz6

                  2 https://blog.csdn.net/qq_32320399/article/details/81518476

                  3 https://blog.csdn.net/codekiller_/article/details/61419120

方法一:

static const auto io_sync_off = []()
{
    // turn off sync
    std::ios::sync_with_stdio(false);
    // untie in/out streams
    std::cin.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    
 double findK(vector&a, int lena, vector&b, int lenb, int k)
    {
        int i = 0, j = 0;

        for(; i < lena && j < lenb; )
        {
            k--;
            if (a[i]= lena) ? b[j+k-1] : a[i+k-1];
    }

    double findMedianSortedArrays(vector &nums1, vector &nums2) {

       int m = nums1.size(), n = nums2.size();
       int left = (m + n + 1 ) / 2, right = (m + n + 2) / 2;

        //求中位数的小技巧,总数奇偶数通用
       return (findK(nums1, m, nums2, n, left) + findK(nums1, m, nums2, n, right)) / 2.0;
    }

};

代码的第一个函数是我在查看leetcode前几名代码中发现的共性,可以从某种程度上减少代码的执行时间,具体细节可查看文章开头第一个连接。

方法一主要是利用一个寻找从小到大排序第K数函数findK()进行操作,最后主函数findMedianSortedArrays()调用findK(),利用求中位数小技巧,当m+n是奇数,则返回的是两个相同的中位数再除以二;当m+n是偶数,则返回的是中间(m+n)/2与(m+n)/2-1位置的数的和除以二,符合结果。上面代码的时间复杂度是O(m+n),但是题目是要求O(log(m+n)),虽然结果是通过了,但是显然是要求使用分治算法解决问题。

方法二:

static const auto io_sync_off = []()
{
    // turn off sync
    std::ios::sync_with_stdio(false);
    // untie in/out streams
    std::cin.tie(nullptr);
    return nullptr;
}();

class Solution {
public:
    int findK(vector &s, int m, vector &l, int n, int k){
        //确保m < n
        if (m > n)
            return findK(l, n, s, m, k);
        if (m == 0)
            return l[k - 1];
        if (k == 1)              
            return min(s[0], l[0]);
        //递归过程   
        int i = min(m, k / 2), j = min(n, k / 2);   
        if (s[i - 1] > l[j - 1])   
           return findK(s, m, l + j, n - j, k - j); 
        else   
           return findK(s + i, m - i, l, n, k - i);  
        return 0;      }  
    }

    double findMedianSortedArrays(vector &nums1, vector &nums2) {

       int m = nums1.size(), n = nums2.size();
       int left = (m + n + 1 ) / 2, right = (m + n + 2) / 2;

        //求中位数的小技巧,总数奇偶数通用
       return (findK(nums1, m, nums2, n, left) + findK(nums1, m, nums2, n, right)) / 2.0;
    }

};

方法二主要是使用二分法,不断缩减查找范围,缩减查找时间,复杂度是O(log(m+n))。

你可能感兴趣的:(leetcode 4 两个排序数组的中位数 C++)