题解 | #Median#

Median

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

#include <iostream>
#include <vector>
using namespace std;
vector<int> vec1;
vector<int> vec2;
int solution(int begin1,int end1,int begin2,int end2,int k){
    if(k==1) return min(vec1[begin1],vec2[begin2]);//找第一小的数字直接返回两个数组较小的那个值
    if(begin1>end1||begin2>end2){//有个数组已经遍历完,那么第k小的数字一定是在另一个数组第k位
        if(begin1>end1) return vec2[begin1+k-1];
        else return vec1[begin2+k-1];
    }
    int mid = k/2;//
    //小的一边的数组从begin位置开始到mid位置中必定没中位数,全部删掉,再递归找第k-mid小的数
    if(vec1[begin1+mid-1]<=vec2[begin2+mid-1]){
        return solution(begin1+mid,end1,begin2,end2,k-mid);
    }else{
        return solution(begin1,end1,begin2+mid,end2,k-mid);
    }
    return 0;
}   
int main() {
    int n,m;
    while (cin>>n) { // 注意 while 处理多个 case
        vec1.resize(n+1);
        for(int i=1;i<=n;i++) cin>>vec1[i];
        cin>>m;
        vec2.resize(m+1);
        for(int i=1;i<=m;i++) cin>>vec2[i];
        int k = (n+m+1)/2;//找第K小
        cout<<solution(1,n,1,m,k)<<endl;
    }
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

专业嗎喽:个人信息名字太大,合到电话邮箱那一栏就行,有党员写过党,剩下其他全删,站空太大了 把实习经历丰富,放最前面,然后是个人评价,技能之类的,然后是学校信息。项目经历最后面,可以就选一个自己擅长的。 现在是学校不是92就扣分的,没必要放前面。 然后现在看重实习经历>竞赛经历(校园经历)>课程项目经历
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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