码迷,mamicode.com
首页 > 编程语言 > 详细

算法:找加数

时间:2016-08-14 07:45:40      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:

题目:已知按序排列的整数数组,输入任意数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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!