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---