java数组查找算法_数组查找算法,数组,a + b = c

题目

给定一个无序数组,例如int[] arr={3,5,8,9,12,21,27},列出所有满足条件的集合:

集合中包含两个值a、b(a和b都在数组中,且a不等于b)

a+b=c,c也要在数组中

思考

先排序。

用 a 和 b的索引来做嵌套循环,a主循环,b子循环,迭代出所有a+b的组合。

将c的索引加入到子循环中,若

arr[a] + arr[b] > arr[c] 则将c++,向右继续寻找有可能相等的c。

arr[a] + arr[b] < arr[c] 则说明右边不可能有相等的c,直接b++,找下一个a+b。

相等则放入数组中。

总结

主要思路是利用排序好的数组从小到大的原理,移动a和b,然后在b的右侧寻找相等的c.

Java解法

package learning;

import java.util.*;

public class ArraySearcher {

public static List searchABC(int[] arr) {

if (null == arr || arr.length == 0) {

return null;

}

int length = arr.length;

List abcPair = new ArrayList<>();

//先从小到大排序

Arrays.sort(arr);

//主循环,用于a的起点向右移动

for (int a = 0; a < length ; a++) {

int b = a;

int c = a + 1;

//子循环,主要移动c来查找a+b=c

while (c < length) { //从左到右

if (arr[a] + arr[b] > arr[c]) {

//因为数组有序,所以若a + b > c 则说明c有可能在右边,移动c

c++;

} else if (arr[a] + arr[b] < arr[c]) {

//若 a + b < c,c不可能在右边,b往右移

b++;

} else {

int[] pair = {arr[a],arr[b],arr[c]};

//找到abc,加入列表

abcPair.add(pair);

c++;

}

}

}

return abcPair;

}

public static void main(String[] args) {

int[] lst = {3,5,8,9,12,21,27};

List result = ArraySearcher.searchABC(lst);

for(int[] l: result) {

System.out.println(l[0]+ " + " + l[1] + " = " + l[2]);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值