4. Median of Two Sorted Arrays
题意:查找两个有序数组的中位数。
思路:通过查找第k个数的方法来找中位数,对于A、B两个数组,如果A[k/2]>B[k/2]那么两个数组并集的中位数肯定不在B的前k/2个元素中,所以可以删掉一部分数,反之亦可,最后剩下的就是所求的中位数。具体见代码。
参考:http://blog.csdn.net/gao1440156051/article/details/51725845
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
// write your code here
int len1=nums1.size();
int len2=nums2.size();
int len=len1+len2;
if(len & 1){
return findKth(nums1,0,nums2,0,len/2+1); //总数为奇数,返回中间的数
}
return (findKth(nums1,0,nums2,0,len/2)+findKth(nums1,0,nums2,0,len/2+1))/2;//总数为偶数,返回中间两个数的和除以2
}
double findKth(vector<int>& nums1,int i1,vector<int>& nums2,int i2,int k){
if(i1>=nums1.size()){
return nums2[i2+k-1]; //说明不在nums1的数组里,直接去nums2数组找
}
if(i2>=nums2.size()){
return nums1[i1+k-1];
}
if(k==1){
return min(nums1[i1],nums2[i2]); //返回最小的那个
}
int key1=i1+k/2-1>=nums1.size()?INT_MAX:nums1[i1+k/2-1];
int key2=i2+k/2-1>=nums2.size()?INT_MAX:nums2[i2+k/2-1];
if(key1<key2){
return findKth(nums1,i1+k/2,nums2,i2,k-k/2); //根据之前的分析缩小查找范围
}else{
return findKth(nums1,i1,nums2,i2+k/2,k-k/2);
}
}
};