题目
原题链接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比较方面好写,这里卡了很久。
然后题目读清楚,先合并数组,不是分别求下标。