如何找到两个有序数组合并后的第k个元素

     //在两个有序数组中找到第k个元素(例如找第一个元素,k=1,即nums[0])
    //思路是比较两个数组的k/2位置的元素,每次淘汰k/2个元素
    //i: nums1的起始位置 j: nums2的起始位置(i,j都是从0开始)
    int findKth(vector<int>& nums1, int i, vector<int>& nums2, int j, int k)
    {
    
    
        //若nums1为空(或是说其中数字全被淘汰了)
        //在nums2中找第k个元素,此时nums2起始位置是j,所以是j+k-1
        if(i >= nums1.size())    return nums2[j + k - 1];
        //nums2同理
        if(j >= nums2.size())    return nums1[i + k - 1];

        //递归出口,k==1,相当于求最小值
        if(k == 1)  return std::min(nums1[i], nums2[j]);

        //这两个数组的第K/2小的数字,若不足k/2个数字则赋值整型最大值,以便淘汰另一数组的前k/2个数字
        int midVal1 = (i + k/2 - 1 < nums1.size()) ? nums1[i + k/2 - 1] : INT_MAX;
        int midVal2 = (j + k/2 - 1 < nums2.size()) ? nums2[j + k/2 - 1] : INT_MAX;
        //二分法核心部分
        if(midVal1 < midVal2)
        //说明nums1数组的前k/2个元素肯定要被淘汰掉,只需要找剩下元素的第k-k/2个元素
            return findKth(nums1, i + k/2, nums2, j, k - k/2);
        else
        //反之淘汰nums2数组的前k/2个元素
            return findKth(nums1, i, nums2, j + k/2, k - k/2);
        //这里由于是尾递归,因此递归调用栈的空间复杂度为O(1)
    }

作者:Terry2020
链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/zong-he-bai-jia-ti-jie-zong-jie-zui-qing-xi-yi-don/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/Fei20140908/article/details/119901024