subject
Given an unordered array, such as int[] arr=, list all sets that meet the criteria:
- A set contains two values a, b(a and B are in the array, and a is not equal to b)
- a+b=c,c also in the array
Reflection
- Sort first.
- Use the index of a and B to do nested loops, a main loop, B sub-loop, iterate out all combinations of a+b.
- Add the index of c to the subloop if
Arr[a] + arr[b] > arr[c] continues to look to the right for possibly equal c++.
Arr[a] + arr[b] < arr[c] means that it is impossible to have the same C on the right, direct b++, find the next a+b.
Equality is put into the array.
summary
The main idea is to move a and b by using the principle of sorted arrays from small to large, and then look for the equal c on the right side of b.
Java Solution
package learning; import java.util.*; public class ArraySearcher { public static List<int[]> searchABC(int[] arr) { if (null == arr || arr.length == 0) { return null; } int length = arr.length; List<int[]> abcPair = new ArrayList<>(); //Sort from smallest to largest first Arrays.sort(arr); //Main loop, moving the starting point of a to the right for (int a = 0; a < length ; a++) { int b = a; int c = a + 1; //Subcycle, mainly moving C to find a+b=c while (c < length) { //From left to right if (arr[a] + arr[b] > arr[c]) { //Since the array is ordered, if a + b > c means that c may move c to the right c++; } else if (arr[a] + arr[b] < arr[c]) { //If a + b < c, C cannot be on the right, b moves to the right b++; } else { int[] pair = ; //Find abc and join the list abcPair.add(pair); c++; } } } return abcPair; } public static void main(String[] args) { int[] lst = ; List<int[]> result = ArraySearcher.searchABC(lst); for(int[] l: result) { System.out.println(l[0]+ " + " + l[1] + " = " + l[2]); } } }