题目:给定两个有序数组nums1,nums2,输出这两个数组排序后的第K个元素
思路:参考评论
1、使用两个变量i和j分别来标记数组nums1和nums2的起始位置。
2、然后来处理一些边界问题,比如当某一个数组的起始位置大于等于其数组长度时,说明其所有数字均已经被淘汰了,相当于一个空数组了,那么实际上就变成了在另一个数组中找数字,直接就可以找出来了。
3、如果K=1的话,那么我们只要比较nums1和nums2的起始位置i和j上的数字就可以了。
4、难点就在于一般的情况怎么处理?因为我们需要在两个有序数组中找到第K个元素,为了加快搜索的速度,我们要使用二分法5、对K二分,分别在nums1和nums2中查找第K/2个元素,注意这里由于两个数组的长度不定,所以有可能某个数组没有第K/2个数字,所以我们需要先检查一下,数组中到底存不存在第K/2个数字,如果存在就取出来,否则就赋值上一个整型最大值。如果某个数组没有第K/2个数字,那么我们就淘汰另一个数字的前K/2个数字即可。
6、比较这两个数组的第K/2小的数字midVal1和midVal2的大小,如果第一个数组的第K/2个数字小的话,那么说明我们要找的数字肯定不在nums1中的前K/2个数字,所以将其淘汰,将nums1的起始位置向后移动K/2个,并且此时的K也自减去K/2,调用递归。反之,淘汰nums2中的前K/2个数字,并将nums2的起始位置向后移动K/2个,并且此时的K也自减去K/2,调用递归即可
代码如下:
int GetKth(vector<int>&nums1,int i,vector<int>&nums2,int j,int k){
if(i>=nums1.size()) return nums2[j+k-1];
if(j>=nums2.size()) return nums1[i+k-1];
if(k==1) return min(nums1[i],nums2[j]);
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){
return GetKth(nums1,i+k/2,nums2,j,k-k/2);
}
else{
return GetKth(nums1,i,nums2,j+k/2,k-k/2);
}
}


1751

被折叠的 条评论
为什么被折叠?



