两个有序数组的第K个元素

题目:给定两个有序数组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);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值