4. 寻找两个正序数组的中位数

  1. 寻找两个正序数组的中位数
    添加链接描述
​
class Solution {
public:
    double findMedianSortedArrays(vector& nums1, vector& nums2) {
        int n1 = nums1.size();
        int n2 = nums2.size();
        if(n1 > n2)return findMedianSortedArrays(nums2, nums1);
        //第k小的数就是中位数或者中位数之一
        int k = (n1 + n2 + 1) / 2;
        int left = 0;
        int right = n1;
        while(left < right){
            //m1为数组1的左半部分的个数,同时也是右半部分第一个值的索引
            int m1 = (left + right) / 2;
            //m2同理
            int m2 = k - m1;
            //比较数组1右半部分最小值与数组2左半部分最大值的大小
            if(nums1[m1] < nums2[m2 - 1]){
                //m1索引之前的均不可能为第k小的数
                left = m1 + 1;
            }else {
                //说明m1索引上的数可能是第k小的数, 现在需要向左缩小范围
                right = m1;
            }
        }
        //left结果就是寻找第k小的数过程中从nums1中取出了多少个数
        int m1 = left;
        int m2 = k - m1;
        int c1;
        if(m1 == 0){
            c1 = nums2[m2 - 1];
        }else if(m2 == 0){
            c1 = nums1[m1 - 1];
        }else {
            //左半部分, 两个最大值中取最大值, (如果是奇数, 那么这个最大值就是答案)
            c1 = max(nums1[m1 - 1], nums2[m2 - 1]);
        }
        //奇数直接返回第k小的数
        if((n1 + n2) % 2 == 1){
            return c1;
        }
        int c2;
        if(m1 == n1){
            c2 = nums2[m2];
        }else if(m2 == n2){
            c2 = nums1[m1];
        }else {
            //右半部分,两个最小值里面取最小值
            c2 = min(nums1[m1], nums2[m2]);
        }
        return (c1 + c2) / 2.0;
    }
};

​具体思路见代码解释

推理过程:

如果 nums1[m1]

你可能感兴趣的:(算法,leetcode,算法)