leetcode4 Median of Two Sorted Arrays学习记录

学习了扁扁熊的题解:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/solution/4-xun-zhao-liang-ge-you-xu-shu-zu-de-zhong-wei-shu/
记录一下,顺便按自己的理解给代码加上注释

#include <vector>
#include <stdio.h>
using namespace std;
#define max(a,b) (((a)>(b)) ? (a) : (b) )
#define min(a,b) (((a)<(b)) ? (a) : (b) )
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m=nums1.size();
        int n=nums2.size();
        //保持数组1为短的是为了提高效率,其实只要选定一个数组二分就可以了。
        if(m>n)
        {
            return findMedianSortedArrays(nums2,nums1);
        }
        //lo是数组的左部,hi是数组的末尾,为了防止奇偶问题,把数组长度已经变成2m+1和2n+1
        //数组末尾应该是2m+1,下标从0开始,所以hi是2m
        int LMax1,LMax2,RMin1,RMin2,c1,c2,lo=0,hi=m*2;
        //开始二分数组1
        while(lo<=hi)
        {
            c1=(lo+hi) /2 ;
            c2 = m+n - c1; //因为分别数组扩大到了2倍,所以是中位数在m+n+1 即(2m+1+2n+1)/2
            //我们知道要保持从c1+c2=k,注意m+n就是相当于m+n+1(下标从0开始)
            
            //当数组1二分完了,如果遇到割在数组的两边,说明整个数组都是大于或者小于目标中位数的
            //这个时候数组1的LMax和RMin是不能参与计算最后的中位数
            //所以要特殊处理一下,例如c1==0,说明数组1整个都大于目标中位数,那么LMax1一定会大于LMax2
            //可我们不希望LMax1作为结果的一部分,结果应该是由LMax2和RMin2计算出来的,所以此时强行把LMax1=INT_MIN
            //这样最后求中位数,就Max(LMax1,LMax2)就不会返回LMax1而是LMAx2。别的情况以此类推
            LMax1=(c1==0)?INT_MIN:nums1[(c1-1)/2];
            RMin1=(c1==2*m)?INT_MAX:nums1[c1/2];
            LMax2=(c2==0)?INT_MIN:nums2[(c2-1)/2];
            RMin2=(c2==2*n)?INT_MAX:nums2[c2/2];
            
            if(LMax1>RMin2)
            {
                hi=c1-1;
            }else if(LMax2>RMin1)
            {
                lo=c1+1;
            }else
                break;
        }
        //题解里解释过,拿#填充扩大2倍的数组,中位数=(LMax+RMin)/2
        return (max(LMax1,LMax2)+min(RMin1,RMin2))/2.0;
    }
};

主要是记录一下,学习完扁扁熊题解的感悟,顺便写一下大佬没详细说明的部分。

posted @ 2019-08-28 22:30  HaoPeng_Zhang  阅读(46)  评论(0编辑  收藏