题目大意:
- 给出两个有序数组,要求输出两个数组合并之后的中位数。
思路:
- 正常思路是按照merge的思想,mid=(m+n-1)/2 (数组从0开始),边merge边判断当前count是否==mid
- 但本题内存限制比较严格,上面思路会有一个测试点超内存。所以可以采用双指针法,只输入第一个数组,边输入第二个数组边与第一个数组比较,时刻注意count的取值。
代码1(有一个测试点内存超载):
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 200005;
const int INF = 0x7fffffff;
int a[maxn],b[maxn];
int main()
{
int n,m;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",&b[i]);
a[n]=b[m]=INF;
int midPos = (m+n-1)/2;
int i=0,j=0,count=0;
while(count<midPos)
{
if(a[i]<b[j]) i++;
else j++;
count++;
}
if(a[i]<b[j])
printf("%d",a[i]);
else
printf("%d",b[j]);
return 0;
}
代码2:转自柳婼 の blog
#include <iostream>
using namespace std;
int k[200005];
int main(){
int n, m, temp, count = 0;
cin >> n;
for (int i = 1; i <= n; i++)
scanf("%d", &k[i]);
k[n + 1] = 0x7fffffff;
cin >> m;
int midpos = (n + m + 1) / 2, i = 1;
for (int j = 1; j <= m; j++) {
scanf("%d", &temp);
while (k[i] < temp) {
count++;
if (count == midpos)
{
cout << k[i];
return 0;
}
i++;
}
count++;
if (count == midpos)
{
cout << temp;
return 0;
}
}
while (i <= n) {
count++;
if (count == midpos) cout << k[i];
i++;
}
return 0;
}