【C++】23行二分法

在两个长度相等的排序数组中找到上中位数

http://www.nowcoder.com/questionTerminal/6fbe70f3a51d44fa9395cfc49694404f

class Solution {
public:
    int findMedianinTwoSortedAray(vector<int>& arr1, vector<int>& arr2) {
        if(arr1.size() == 1) return min(arr1[0], arr2[0]); //若总数为2直接返回较小数即可
        int l1 = 0, r1 = arr1.size() - 1, l2 = 0, r2 = arr2.size() - 1; //四个指针分别指向两个数组的首尾
        int mid1 = 0, mid2 = 0, even = 0; //用于记录每轮中间的指针和当前子区间是否为偶数
        while(l1 < r1) {
            even = (r1 - l1) % 2; //偶数为1,奇数为0
            mid1 = (l1 + r1) >> 1; //求第一个数组中间指针
            mid2 = (l2 + r2) >> 1; //求第二个数组中间指针
            if(arr1[mid1] == arr2[mid2]) return arr1[mid1]; //若是子区间中间值相等,则直接返回数值
            else if(arr1[mid1] < arr2[mid2]) { //当一个子区间的中值小于另一个区间的中值时
                l1 = mid1 + even; //我们取较小中值区间的右半部分,注意长度为偶数的子区间中值后一位才是右半部分的起点
                r2 = mid2; //取较大中值区间的左半部分
            }
            else { //以下同理
                l2 = mid2 + even;
                r1 = mid1;
            }
        }
        return min(arr1[l1], arr2[l2]); //此时两个指针指向排序后中间的两个数,只需返回其中较小的数
    }
};
全部评论

相关推荐

ohs的小木屋:比不少实习待遇高了
点赞 评论 收藏
分享
屌丝逆袭咸鱼计划:心态摆好,man,晚点找早点找到最后都是为了提升自己好进正职,努力提升自己才是最关键的😤难道说现在找不到找的太晚了就炸了可以鸡鸡了吗😤早实习晚实习不都是为了以后多积累,大四学长有的秋招进的也不妨碍有的春招进,人生就这样
点赞 评论 收藏
分享
06-13 10:15
门头沟学院 Java
想去夏威夷的大西瓜在...:我也是27届,但是我现在研一下了啥项目都没有呀咋办,哎,简历不知道咋写
点赞 评论 收藏
分享
评论
17
2
分享

创作者周榜

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