首页 > 技术文章 > PAT 2-13. 两个有序序列的中位数(25)

CHLL55 2015-03-15 22:09 原文

题目链接:http://www.patest.cn/contests/ds/2-13

解题思路及代码如下:

/*
解题思路: 
分别求出序列A 和B 的中位数,设为a 和b,求序列A 和B 的中位数过程如下:
1)若a=b,则a 或b 即为所求中位数,算法结束。
2)若a<b,则舍弃序列A中较小的一半(如果A长度为奇数则保留a,如果为偶数则不保留a),同时舍弃序列B中较大的一半,要求舍弃的长度相等;
3)若a>b,则舍弃序列A中较大的一半,同时舍弃序列B中较小的一半(如果B长度为奇数则保留b,如果为偶数则不保留b),要求舍弃的长度相等;
在保留的两个升序序列中,重复过程1)、2)、3),直到两个序列中只含一个元素时为止(即是结束条件),较小者即为所求的中位数。
(每次执行过程A和B的剩余长度相等,并且要每次更新序列A和B的长度) 
*/
#include<iostream>
using namespace std;
int n,A[100005],B[100005];
int getMiddle()
{
	int AStart=0,AEnd=n-1,BStart=0,BEnd=n-1;
	int a=A[(n-1)/2];
	int b=B[(n-1)/2];
	while(AEnd!=AStart)
	{
		if(a==b)
		{
			return a;
		}
		else if(a<b)
		{
			if(n%2==1)
			{
				AStart=(AStart+AEnd)/2;
				a=A[(AEnd+AStart)/2];
				BEnd=(BStart+BEnd)/2;
				b=B[(BEnd+BStart)/2];
				n=n/2+1;
			}
			else
			{
				AStart=(AStart+AEnd)/2+1;
				a=A[(AEnd+AStart)/2];
				BEnd=(BStart+BEnd)/2;
				b=B[(BEnd+BStart)/2];
				n=n/2;
			}
		}
		else//a>b
		{
			if(n%2==1)
			{
				AEnd=(AStart+AEnd)/2;
				a=A[(AEnd+AStart)/2];
				BStart=(BStart+BEnd)/2;
				b=B[(BEnd+BStart)/2];
				n=n/2+1;
			}
			else
			{
				AEnd=(AStart+AEnd)/2;
				a=A[(AEnd+AStart)/2];
				BStart=(BStart+BEnd)/2+1;
				b=B[(BEnd+BStart)/2];
				n=n/2;
			}
		}
	}
	return a<b?a:b;
}
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>A[i];
	}
	for(int i=0;i<n;i++)
	{
		cin>>B[i];
	}
	cout<<getMiddle()<<endl;
	return 0;
}

  

推荐阅读