标签:
题目:已知按序排列的整数数组,输入任意数number,当数组中某两数之和等于number时,打印出两个数。
要求:复杂度为o(n)
解法:
数组已是有序排列,且两个加数一定满足条件:较小加数<= (number/2) <= 较大加数;那么只需要找出该数组的较小加数和较大加数分界index,分别从两边取值逐个匹配即可。
若两数之和>number,说明较小加数还要再小,向数组的较小值方向移位取值与原较大值重新匹配。
若两数之和<number,说明较大加数还要再大,向数组的较大值方向移位取值与原较小值重新匹配。
1 public void seachAdden(int number, int[] arry) { 2 int midIndex = 0; // 较大加数和较小加数的分界 3 boolean result = false; 4 for (int i = 0; i < arry.length; i++) { // 定位midIndex的值 5 if (arry[i] > (number / 2)) { 6 midIndex = i - 1; // 如果数组的第一个数就已经大于用户输入的数字,则midIndex为-1 7 break; 8 } else if (i < arry.length - 1 && (arry[i + 1] + arry[i] == number)) { 9 if (arry[i + 1] == arry[i]) { 10 // 匹配成功 11 printResult(i,i+1,arry,number); 12 result = true; 13 } 14 } 15 } 16 if (midIndex != -1) { 17 int smallerIndex = midIndex; // 记录较小加数在数组中的下标 18 int biggerIndex = midIndex + 1; // 记录较大加数在数组中的下标 19 do {// 开始匹配 20 if (arry[smallerIndex] + arry[biggerIndex] > number) { 21 smallerIndex--; 22 } else if (arry[smallerIndex] + arry[biggerIndex] < number) { 23 biggerIndex++; 24 } else { 25 // 匹配成功 26 printResult(smallerIndex,biggerIndex,arry,number); 27 result = true; 28 29 if (smallerIndex - 1 >= 0 30 && arry[smallerIndex] == arry[smallerIndex - 1]) { 31 smallerIndex--; 32 printResult(smallerIndex,biggerIndex,arry,number); 33 } 34 if (biggerIndex + 1 <= arry.length - 1 35 && arry[biggerIndex] == arry[biggerIndex + 1]) { 36 biggerIndex++; 37 printResult(smallerIndex,biggerIndex,arry,number); 38 } 39 smallerIndex--; 40 biggerIndex++; 41 } 42 } while ((smallerIndex >= 0) && (biggerIndex <= arry.length - 1)); 43 } 44 if (result == false) { 45 System.out.println("无匹配"); 46 } 47 } 48 49 public void printResult(int i, int j,int[]arry,int number){ 50 System.out.println("arry[" + i + "] 和 arry[" + j 51 + "] 匹配,即 " + arry[i] + " + " + arry[j] 52 + " = " + number); 53 }
举例:
标签:
原文地址:http://www.cnblogs.com/cheneva/p/5769368.html