题解 | 多数组中位数

多数组中位数

https://www.nowcoder.com/practice/b6bb0bce88894108bfc23e9b7b012420

#include <climits>
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param arr1 int整型vector 
     * @param arr2 int整型vector 
     * @return int整型
     */
    int getUpMedian(vector<int>& arr1, vector<int>& arr2) {
        //把两个数组都左右分,左边的数都小于右边的数,也就是左边的两个边界数要小于右边的边界数
        int n1 = arr1.size();
        int n2 = arr2.size();
        int alllen = n1+n2;
        int leftlen = (alllen + 1)/2;  //左边的数多一个
        if(n2 < n1){
            swap(arr1, arr2);   //让arr1是数量小的那个数;
            swap(n2, n1);       //让n1是小的数组长度;
        }
        
        int L = -1, R = n1;
        while(L < R){
            int mid = (L+R)/2;  //mid作为第一个数组的左边界下标
            int l2 = leftlen - mid - 2;  //3-0-2 = 1;  得到左边界下标

            int left_1 = ( mid== -1 )? INT_MIN : arr1[mid];     //再考虑越界问题,将越界的下标设置成max和min取不到的值,右边界取max,所以INT_min取不到;
            int right_1 = ( mid == n1-1 )? INT_MAX: arr1[mid+1];
            int left_2 = ( l2 == -1 )? INT_MIN: arr2[l2];
            int right_2 = ( l2 == n2-1) ? INT_MAX: arr2[l2+1];

            if( left_1 > right_2 ){
                R = mid;
                continue;
            }

            if( left_2 > right_1 ){
                L = mid;
                continue;
            }

            L = mid;   //最后L是我们要的数
            break;
        }

        return max(arr1[L], arr2[leftlen -L -2]);  //下边界
    }
};

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务