Encontre todos os pares de números em uma matriz que somam uma determinada soma
1. Visão geral
Neste tutorial rápido, mostraremos como implementar um algoritmo para encontrar todos os pares de números em uma matriz cuja soma é igual a um determinado número. Vamos nos concentrar emtwo approaches to the problem.
Na primeira abordagem, encontraremos todos esses pares, independentemente da sua exclusividade. No segundo, encontraremos apenas as combinações de números únicos, removendo pares redundantes.
Para cada abordagem, apresentaremos duas implementações - uma implementação tradicional usandofor loops e uma segunda usando a API Java 8 Stream.
2. Retornar todos os pares correspondentes
Iremos iterar por meio de uma matriz de inteiros, encontrando todos os pares (iej) que somam o número fornecido (sum) usando uma abordagem de força bruta e loop aninhado . This algorithm will have a runtime complexity of O(n2).
Para nossas demonstrações, procuraremos todos os pares de números cuja soma seja igual a6, usando a seguinte matrizinput:
int[] input = { 2, 4, 3, 3 };
Nesta abordagem, nosso algoritmo deve retornar:
{2,4}, {4,2}, {3,3}, {3,3}
Em cada um dos algoritmos, quando encontramos um par de números de destino que somam o número de destino, coletaremos o par usando um método utilitário,addPairs(i, j).
A primeira maneira que podemos pensar para implementar a solução é usando o loopfor tradicional:
for (int i = 0; i < input.length; i++) {
for (int j = 0; j < input.length; j++) {
if (j != i && (input[i] + input[j]) == sum) {
addPairs(input[i], sum-input[i]));
}
}
}
Isso pode ser um pouco rudimentar, entãolet’s also write an implementation using the Java 8 Stream API.
Aqui, usamos o métodoIntStream.range para gerar um fluxo sequencial de números. Em seguida, os filtramos para nossa condição:number 1 + number 2 = sum:
IntStream.range(0, input.length)
.forEach(i -> IntStream.range(0, input.length)
.filter(j -> i != j && input[i] + input[j] == sum)
.forEach(j -> addPairs(input[i], input[j]))
);
3. Retorne todos os pares únicos correspondentes
Para este exemplo, teremos quedevelop a smarter algorithm that returns only the unique number combinations, omitting redundant pairs.
Para conseguir isso, vamos adicionar cada elemento a um mapa hash (sem classificação), verificando primeiro se o par já foi mostrado. Caso contrário, iremos recuperá-lo e marcá-lo conforme mostrado (defina o campovalue comonull).
Assim, usando a mesma matrizinput de antes e uma soma alvo de6, nosso algoritmo deve retornar apenas as diferentes combinações de números:
{2,4}, {3,3}
Se usarmos um saveirofor tradicional, teremos:
Map pairs = new HashMap();
for (int i : input) {
if (pairs.containsKey(i)) {
if (pairs.get(i) != null) {
addPairs(i, sum-i);
}
pairs.put(sum - i, null);
} else if (!pairs.containsValue(i)) {
pairs.put(sum-i, i);
}
}
Observe que esta implementação melhora a complexidade anterior, poiswe use only one for loop, so we’ll have O(n).
Agora vamos resolver o problema usando Java 8 e a API Stream:
Map pairs = new HashMap();
IntStream.range(0, input.length).forEach(i -> {
if (pairs.containsKey(input[i])) {
if (pairs.get(input[i]) != null) {
addPairs(input[i], sum - input[i]);
}
pairs.put(sum - input[i], null);
} else if (!pairs.containsValue(input[i])) {
pairs.put(sum - input[i], input[i]);
}
});
4. Conclusão
Neste artigo, explicamos várias maneiras diferentes de encontrar todos os pares que somam um determinado número em Java. Vimos duas soluções diferentes, cada uma usando dois métodos principais de Java.
Como de costume, todos os exemplos de código mostrados neste artigo podem serfound on GitHub - este é um projeto Maven, portanto, deve ser fácil de compilar e executar.