问题描述:见http://pat.zju.edu.cn/contests/pat-practise/1029
大概就是两个排好序的序列,求两个序列总的中间数。
解决:
1、最直接的想法就是将两个数组合并,然后求中间值。由于原来已经排好序,时间复杂度为O(n1+n2),这也算不上是归并排序。
2、然后我想用O(logn1+logn2)的二分查找的方法,每次提取两个序列的中间值,将mid1和mid2进行比较,将较大者的右边和较小者的左边去掉。
这样就可以排除一半的数据,即两个数据中心不断靠近。但是实现起来细节处理太麻烦了,最后自己崩溃了,有些case过不了,就先放着不管了。
贴1 的代码:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int i;
int n1,n2;
int *data1;
int *data2;
int *data_total;
int cur1,cur2;
cin>>n1;
data1 = new int[n1];
for(i=0;i<n1;i++)
scanf("%d",&(data1[i]));
cin>>n2;
data2 = new int[n2];
for(i=0;i<n2;i++)
scanf("%d",&(data2[i]));
data_total = new int[n1+n2];
cur1 = cur2 = 0;
for(i=0;i<n1+n2;i++)
{
if(cur1==n1)
{
data_total[i] = data2[cur2++];
}else if(cur2 == n2)
{
data_total[i] = data1[cur1++];
}else
{
if(data1[cur1]<data2[cur2])
data_total[i] = data1[cur1++];
else
data_total[i] = data2[cur2++];
}
}
cout<<data_total[(n1+n2-1)/2]<<endl;
delete []data1;
delete []data2;
delete []data_total;
cin>>i;
return 0;
}
浙公网安备 33010602011771号