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

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

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

假定输入数组从小到大排列。
i=0,j=arr2.size()-1,直接二分查找,得到arr1、arr2的最终查找结果下标为i、j,

查找方法为:
arr1[i]==arr2[j]时直接输出;
arr1[i]<arr2[j]时,arr1向右查找,arr2向左查找
arr1[i]>arr2[j]时,arr1向左查找,arr2向右查找

但是,最后得到的中位数不一定是arr1[i]或者arr2[j],原因如下:
由i,j的轮换对称性,不妨认为最后一次查找情况如下(下标对应arr中的数):
i-1 i
j j+1
4个数的相对位置是不确定的,只能保证arr1[i-1]<=arr1[i],arr2[j]<=arr2[j+1]
arr1[i-1]<arr2[j+1](所以arr1向右查找,arr2向左查找)
因此,有5种可能的排列情况:
j , i-1 , i , j+1
i-1 , j , i , j+1
i-1 , i , j , j+1
j , i-1 , j+1 , i
i-1 , j , j+1 , i
中位数有可能是i-1,反之也可能是j-1.

例如,当输入为:
10 , 15 , 20
05 , 09 , 11
运行结果arr1[i]=15,arr2[j]=09,但正确结果是10
所以,在最后用了如下方法:
tmp.push_back(arr1.at(i));
tmp.push_back(arr2.at(j));
tmp.push_back(arr1.at(i-1));
tmp.push_back(arr2.at(j-1));
tmp.push_back(arr1.at(i+1));
tmp.push_back(arr2.at(j+1));
sort(tmp.begin(),tmp.end());
return tmp[(tmp.size()-1)/2];
将最终得到的i,j的左右2个数也算上,一起来求中位数。

完整代码如下:
/通过全部用例
运行时间 70ms
占用内存 5764KB
/

class Solution {
public:
/**
* find median in two sorted array
* @param arr1 int整型vector the array1
* @param arr2 int整型vector the array2
* @return int整型
*/
int findMedianinTwoSortedAray(vector<int>& arr1, vector<int>& arr2) {
// write code here
//sort(arr1.begin(),arr1.end());
//sort(arr2.begin(),arr2.end());
int arr1_len=arr1.size();
int arr2_len=arr2.size();</int></int>

    int i=0,j=arr2_len-1; // critical error
    int i_l=0,i_r=arr1_len-1;
    int j_l=0,j_r=arr2_len-1;

    while(i_l<i_r)
    {
        if(arr1[i]==arr2[j])
        {
            return arr1[i];
        }
        if(arr1[i]<arr2[j])
        {
            i_l=i+1;
            j_r=j-1;
            i=(i_l+i_r+1)/2;
            j=(j_l+j_r)/2;
        }
        else
        {
            i_r=i-1;
            j_l=j+1;
            i=(i_l+i_r)/2;
            j=(j_l+j_r+1)/2;
        }
    }

    vector<int> tmp;
    /*
    i,j may not contain the final answer
    for example:
        10  20  30
        05  09  21
        i -> 20, j -> 09, but the right answer is 10
    so, do as follow:
    */
    tmp.push_back(arr1.at(i));
    tmp.push_back(arr2.at(j));
    tmp.push_back(arr1.at(i-1));
    tmp.push_back(arr2.at(j-1));
    tmp.push_back(arr1.at(i+1));
    tmp.push_back(arr2.at(j+1));
    sort(tmp.begin(),tmp.end());
    return tmp[(tmp.size()-1)/2];
}

};

全部评论

相关推荐

笑着秋招😊:我一直认为努力有回报是一件很幸福很幸福的事情,恭喜你
点赞 评论 收藏
分享
点赞 评论 收藏
分享
头像
10-22 20:13
中南大学 Java
序言大家好呀。我是希晨er,一个初入职场的程序猿小登最近上班摸鱼刷到了一篇文章:10年深漂,放弃高薪,回长沙一年有感,还有聊聊30岁大龄程序员过往的心路历程,突然就有点感慨。我如今也做出了和大明哥一样的抉择,只是更早。此外我22年的人生,好像从来没好好记录过。正好现在工作不太忙,就想把这些经历写下来,也希望能得到社区里各位前辈的指点个人背景我是03年出生的西安娃,父母都是普通打工人。刚从中南大学软件工程专业毕业半年,现在在老家的央企过着躺平摆烂的日子成长轨迹从农村到城市的童年我家并不是西安的,只是爸妈在西安上班,从小学之后就把我接到了西安。后来老家房子拆了,爷爷奶奶也搬了过来。农村的生活,我觉...
Yki_:看哭了,恋爱那一段你女朋友说你不够关心她,可你毕竟也愿意遇到矛盾写几千字来和她慢慢分析;说不愿意给她花钱,我感觉可能只是消费观不一样;如果她想留在长沙,也应该提前跟你说开。不过她也许会心疼你放弃大厂offer转向数字马力?我也因为同样的原因有过一段幸福而充满遗憾的感情,不过跟爱情相比确实前途更重要一点。至于offer的选择,换我我也会这么选。把这些旧事记录下来以后,接下来就好好向前看吧,加油兄弟
🍊晨光随笔
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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