【【【递归】】】

  • LeetCode 4.寻找两个正序数组的中位数
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int tot=nums1.size()+nums2.size();
        if(tot%2==0){
            int left=find(nums1,0,nums2,0,tot/2);
            int right=find(nums1,0,nums2,0,tot/2+1);
            return (left+right)/2.0; //注意不要取整
        }else{
            return find(nums1,0,nums2,0,tot/2+1);
        }
    }

    int find(vector<int>& nums1,int i,vector<int>& nums2,int j,int k){
        //第一个数组短
        if(nums1.size()-i>nums2.size()-j)
            return find(nums2,j, nums1,i,k);

        //边界1:返回两个数组最小值
        if(k==1){
            //nums1可能为空
            if(nums1.size()==i) return nums2[j];
            else return min(nums1[i],nums2[j]);
        }
        //边界2:第一个数组为空 反回第二个数组第k个数
        if(nums1.size()==i) return nums2[j+k-1];

        //递归部份
        //vector数组中size()返回值是size_type,而size_type的类型是unsigned int,min接受int型参数,需要强转
        int si=min((int)nums1.size(),i+k/2); //第k/2个元素的后一个元素,可能长度不够
        int sj=j+k-k/2;
        if(nums1[si-1]>nums2[sj-1])
            //nums2前段不再考虑
            return find(nums1,i,nums2,sj,k-(sj-j));
        else
            //nums1前段不再考虑
            return find(nums1,si,nums2,j,k-(si-i));
    }
};

你可能感兴趣的:(刷题,c++,算法)