【题解】
假设在两个有序的序列中找第k小的数字。
那么我们先定位第一个序列中的第k/2个数字(不足则取最边上的那个数字)记下标为i1
然后定位第二个序列中的第k/2个数字(同样不足则取最边上的那个数字)记下标为i2
如果a[i1]<a[i2]
那么显然a[1],a[2],a[3]...a[i1]都不会是第k小的数字(因为有个a[i2]挡着他们呢).
因此我们可以把a[1],a[2]..a[i1]都删掉。
然后转换成找a,b两个有序序列的第k-i1小的数字。
否则把b[1],b[2],b[3]..b[i2]删掉就好
【代码】
class Solution {
public:
int n,m;
double findkth(vector<int> &nums1,vector<int> &nums2,int l1,int r1,int l2,int r2,int k){
if (l1>r1) return nums2[l2+k-1];
if (l2>r2) return nums1[l1+k-1];
if (k==1) return min(nums1[l1],nums2[l2]);
int temp = k/2;
int i1 = l1+temp-1;
int i2 = l2+temp-1;
if (i1>r1) i1 = r1;
if (i2>r2) i2 = r2;
if (nums1[i1]<nums2[i2]){
//把l1..i1全删掉
return findkth(nums1,nums2,i1+1,r1,l2,r2,k-(i1-l1+1));
}else{
//把l2..i2全删掉
return findkth(nums1,nums2,l1,r1,i2+1,r2,k-(i2-l2+1));
}
}
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
n = nums1.size();m = nums2.size();
if ((n+m)%2==1){
return findkth(nums1,nums2,0,n-1,0,m-1,(n+m+1)/2);
}else{
double temp = findkth(nums1,nums2,0,n-1,0,m-1,(n+m)/2);
temp+=findkth(nums1,nums2,0,n-1,0,m-1,(n+m)/2+1);
temp/=2;
return temp;
}
}
};
原文地址:https://www.cnblogs.com/AWCXV/p/11779652.html
时间: 2024-10-18 23:41:21