逐行输出三个顺序表中共同存在的元素

给定三个序列A,B,C,长度均为n,且均无重复元素的递增序列,设计一个时间上尽可能高效的算法,逐行输出同时存在于这三个元素中的所有元素。例如数组A为{1,2,3},数组B为{2,3,4},数组C为{-1,0,2},则输出2。

思想:定义三个移动指针,开始分别指向三个数组的第一个元素,比较三个指针指的元素大小,当相等时,输出该元素,并将三个指针加1,向后遍历,否则,向后移动最小的一个元素指针,至到移除数组范围后,停止。

具体例子:

数组A为{1,2,3,4},数组B为{2,3,4,5},数组C为{-1,0,2,3,4}

开始时,i指向1,j指向2,k指向-1,均不相等,最小的为k,k进行向后移动,指向0,此时依然最小,继续往后,指向2,此时三个数字中最小的是i指向1,将i向后面移动,指向2,此时i,j,k均指向2,相等,输出2,并将三个指针向后面移动。

此时i指向3,j指向3,k指向3,相等,输出3,将三个指向后移。

此时i指向4,j指向4,k指向4,相等,输出4,将三个指向后移。

此时i超出数组范围,停止向后遍历,最后输出2,3,4。

代码:

void samekey(int A[],int B[],int C[],int n){
	int i=0,j=0,k=0;//三个工作指针,开始时,均指向表中的第一个元素 
	while(i<n&&j<n&&k<n){
		if(A[i]==B[j]&&B[j]==C[k]){//三个指针指向相同元素则输出 
			printf("%d\n",A[i]);
			i++;//指针均向后移动 
			j++;
			k++;
		}else{
			int Maxnum=max(A[],max(B[],C[]));//找出三个指针指向的最大元素 
			if(A[i]<Maxnum) i++;//将比最大元素校的元素向后面移动 
		    if(B[j]<Maxnum) j++;
		    if(C[k]<Maxnum) k++;
		}
	}
}

时间复杂度O(n);空间复杂度O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值