Median

Median

http://www.nowcoder.com/questionTerminal/b5da3f56557f42978ca87afedbd85fbe

题意就是找两个升序数组合并后的中位数,

思路:假设a和b数组的大小分别是n1和n2,不进行排序,因为a和b数组本身就是排好序的,直接从小到大读a数组和b数组的元素,第(n1+n2)/2(向上取整)个元素即为所求。

#include<stdio.h>
int main()
{
    int n1,n2;
    scanf("%d",&n1);
    long a[n1];
    for(int i = 0;i<n1;i++)
        scanf("%ld",&a[i]);
    scanf("%d",&n2);
    long b[n2];
    for(int i = 0;i<n2;i++)
        scanf("%ld",&b[i]);

    int index = (n1+n2+1)/2; // 最终要求的中位数在合并后的数组的位置
    long ans;
    int i1 = 0,i2 = 0;
    for(int i =0;i!=index;i++)
    {
        if(a[i1] < b[i2])
            ans = a[i1++];
        else
            ans = b[i2++];
    }
    printf("%ld",ans);
    return 0;
}
全部评论
for(int i = 0; i != index; i++) { if(i1 == n1) ans = b[i2++]; else if(i2 == n2) ans = a[i1++]; else { if(a[i1] < b[i2]) ans = a[i1++]; else ans = b[i2++]; } } 这样就完美了
点赞 回复 分享
发布于 2023-03-10 14:04 河南
这段代码可以过牛客的检查,但是有一个问题就是没有对特殊情况进行考虑,比如对下面的例子: N = 2 分别为1, 3 M = 5 分别为9, 10, 11, 12, 13 此时利用该算法将会导致段错误。
点赞 回复 分享
发布于 2023-03-10 13:48 河南

相关推荐

06-25 21:00
门头沟学院 Java
多拆解背记一下当前的高频场景面试题,结合自己的项目经历去作答,面试通过率原来真的不会低!
牛客965593684号:小公司不就是这样的吗,面试要么是点击就送,要么就是往死里拷打,没有一个统一的标准。这个不能代表所有公司
点赞 评论 收藏
分享
炫哥_:哥们项目描述里面vector和mysql之类的都要写吗,直接开头技术栈巴拉巴拉就行了,完全不是技术点啊
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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