现在的位置: 首页 > 综合 > 正文

中位数 (等长 不等长 DFS求卡特兰)

2013年12月01日 ⁄ 综合 ⁄ 共 1464字 ⁄ 字号 评论关闭
//寻找数组最小值
int Find(int a[],int b[],int len)
{
	if(len==1)
	{
		return min(a[0],b[0]);
	}
	int mid=(len-1)/2;//偶数取小的  奇数取中间
	if(a[mid]==b[mid])
		return a[mid];
	else if(a[mid]<b[mid])
	{
		Find(a+len-mid-1,b,mid+1);
	}
	else
	{
		Find(a,b+len-mid-1,mid+1);
	}
}
int Find_G(int a[],int b[],int len)
{
	int mid;
	while(1)
	{
		if(len==1)
			return min(a[0],b[0]);
		mid=(len-1)/2;//偶数取下,奇数取中
		if(a[mid]==b[mid])
			return a[mid];
		else if(a[mid]<b[mid])
		{
			a=a+len-mid-1;
			len=mid+1;
		}
		else
		{
			b=b+len-mid-1;
			len=mid+1;
		}
	}
}
//不等长数组
int Find_GG(int a[],int lena,int b[],int lenb)
{
	int mida=lena/2;//奇数取中间,偶数取上边
	int midb=lenb/2;
	int low=min(mida,midb);
	if(lena==1)
	{
		if(lenb%2==0)
		{//
			if(a[0]>=b[midb])
			{//则b[midb]为中点
				return b[midb];
			}
			else if(a[0]<=b[midb-1])
				return b[midb-1];
			else//此时a[0]正好夹在中间
				return a[0];
		}
		else
		{//为奇数+奇数
			return b[midb];

		}
	}
	if(lenb==1)
	{
		if(lena%2==0)
		{
			if(b[0]>=a[mida])
				return a[mida];
			else if(b[0]<a[mida-1])
				return a[mida-1];
			else
				return b[0];
		}
		else
			return a[mida];
	}
	if(a[mida]==b[midb])
		return a[mida];
	else if(a[mida]<b[midb])
	{
		return Find_GG(a+mida,lena-low,b,lenb-low);
	}
	else
		return Find_GG(a,lena-low,b+midb,lenb-low);
}
void DFS(char* str,int n,int left,int right)
{
	if(left==right&&left+right==2*n)
	{
		for(int i=0;i<2*n;i++)
			cout<<str[i]<<" ";
		cout<<endl;
		return;
	}
	if(left<right||left+right>2*n)
		return;
	int index=left+right;
	str[index]='(';
	DFS(str,n,left+1,right);
	str[index]=')';
	DFS(str,n,left,right+1); 
}
int _tmain(int argc, _TCHAR* argv[])
{
	int a[]={1,3,5,7,9};
	int b[]={2,4,6,8,10};
	cout<<Find_GG(a,sizeof(a)/sizeof(int),b,sizeof(b)/sizeof(int));
	int n=3;
	char str[1000];
	memset(str,0,sizeof(str));
	DFS(str,n,0,0);
	return 0;
}

抱歉!评论已关闭.