public class YouXuShuzu_QiuGongGongYuansu {
public static void main(String[] args) {
int[] queue1 = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,19,22};//18个元素
int[] queue2 = {1,5,7,8,9,10,12,13,15,19,22};//11个元素
int[] queue3 = {1,5,7,8,11,13,19,20,22};//9个元素
commonOnes(queue1,queue2,queue3);
}
/**
* 3个有序的数组(从小到大),求在3个数组中都存在的公共元素<br>
* 思想是:<br>
* (1)使用3个指针,在3个数组上从左向右遍历。3个指针初始化时均在第一个元素上。<br>
* (2)比较指针指向的3个数,判断是否相等,<br>
* 如果3个数相等,则输出,且3个指针向右移动一步;<br>
* 如果3个数不全相等,则找出最大值N。比较小的数所在的2个数组,2个指针分别向右移动,直到找到>=N的数或数组尽头,指针停止移动。<br>
* 如果某个数组到了尽头且未找到>=N的数,则程序结束。<br>
* 否则,继续执行(2).<br>
*/
public static void commonOnes(int[] queue1,int[] queue2,int[] queue3){
int i=0,j=0,k=0;
int count=0;//循环次数
int pointCount=0;//指针移到次数,应该是O(n)
while(i<queue1.length && j<queue2.length && k<queue3.length){
if( queue1[i] == queue2[j] && queue1[i] == queue3[k]){
//如果3个数相等,则输出,且3个指针向右移动一步;
System.out.print(queue1[i]+" ");
i++;j++;k++;pointCount+=3;
}else if(i==queue1.length-1 && j==queue2.length-1 && k==queue3.length-1){
//如果某个数组到了尽头且未找到>=N的数,则程序结束
return;
}else{
//如果3个数不全相等,则找出最大值N。比较小的数所在的2个数组,2个指针分别向右移动,直到找到>=N的数或数组尽头,指针停止移动。
int maxNum = max(queue1[i],queue2[j],queue3[k]);
while(queue1[i]<maxNum && i<queue1.length-1){i++;pointCount++;}
while(queue2[j]<maxNum && j<queue2.length-1){j++;pointCount++;}
while(queue3[k]<maxNum && k<queue3.length-1){k++;pointCount++;}
}
count++;
}
System.out.print("\n循环次数:"+count);
System.out.print("\n指针移到次数(最大情况是等于3个数组的总长度):"+pointCount);
}
private static int max(int a, int b, int c) {
int temp = a<b ? b:a;
return temp<c ? c:temp;
}
}
效果:
1 5 7 8 13 19 22
循环次数:14
指针移到次数(最大情况是等于3个数组的总长度):38
---EOF---