找出有序数组中和等于指定数的两个数

题目:已知按序排列的整数数组,输入任意数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             }
 9         }
10         if (midIndex != -1) {
11             int smallerIndex = midIndex; // 记录较小加数在数组中的下标
12             int biggerIndex = midIndex + 1; // 记录较大加数在数组中的下标
13             do {// 开始匹配
14                 if (arry[smallerIndex] + arry[biggerIndex] > number) {
15                     smallerIndex--;
16                 } else if (arry[smallerIndex] + arry[biggerIndex] < number) {
17                     biggerIndex++;
18                 } else {
19                     // 匹配成功
20                     System.out.println("arry[" + smallerIndex + "] 和 arry[" + biggerIndex
21                             + "] 匹配,即  " + arry[smallerIndex] + " + " + arry[biggerIndex]
22                             + " = " + number);
23                     result = true;
24                     smallerIndex--;
25                     biggerIndex++;
26                 }
27             } while ((smallerIndex >= 0) && (biggerIndex <= arry.length - 1));
28         }
29         if (result == false) {
30             System.out.println("无匹配");
31         }
32     }
复制代码

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值