逐行输出三个顺序表中共同存在的元素
给定三个序列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)