【PAT1029】Median

题目

原题链接https://pintia.cn/problem-sets/994805342720868352/problems/994805466364755968.
在这里插入图片描述

解决思路

把两行读入,存进两个数组中,求两个数组和的个数,求他们合并之后中位数的下标,奇数是除以2加1,偶数是除以2。
在用m和n下标在两个数组中按大小顺序读,组成一个数组c,并在生成了数组c后用下标读取该数组的中位数。

代码实现

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int N = 200000;
int a[N], b[N], c[N*2];
int main(){
    int lenA, lenB = 0;
    cin >> lenA;
    for(int i=0; i<lenA; i++){
        cin >> a[i];
    }


    cin >> lenB;
    for(int i=0; i<lenB; i++){
        cin >> b[i];
    }
    
    int lenSum = lenA + lenB;
    int index;
    if(lenSum % 2 == 1) index = lenSum / 2;
    else index = lenSum / 2 - 1;
    //cout<<index<<endl;
    int m=0, n=0;
    int i = 0;
    while(m < lenA && n < lenB){
        if(a[m] <= b[n]){
            c[i++] = a[m++];
            //cout<<c[i];
        }else{
            c[i++] = b[n++];
        }
        
    }
    while(m < lenA){
        c[i++] = a[m++];
    }
    while(n < lenB){
        c[i++] = b[n++];
    }
    //for(int j=0; j<lenSum;j++) cout<<c[j]<<endl;
    cout << c[index];
    return 0;
}

注意点

在合并两个数组时,注意一个数组全部读完的情况,所以在第一次比较循环后还要加两个循环分别读入剩下的数组元素。这个很重要,然后在这里代码实现用while语句不要用for!因为while比较方面好写,这里卡了很久。
然后题目读清楚,先合并数组,不是分别求下标。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值