//在两个有序数组中找到第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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。