Dada a matriz de n números inteiros e o número X, encontre todos os pares únicos de elementos (a, b), cuja soma é igual a X.
A seguinte é minha solução, é O (nLog (n) + n), mas não tenho certeza se é ideal ou não.
int main(void)
{
int arr [10] = {1,2,3,4,5,6,7,8,9,0};
findpair(arr, 10, 7);
}
void findpair(int arr[], int len, int sum)
{
std::sort(arr, arr+len);
int i = 0;
int j = len -1;
while( i < j){
while((arr[i] + arr[j]) <= sum && i < j)
{
if((arr[i] + arr[j]) == sum)
cout << "(" << arr[i] << "," << arr[j] << ")" << endl;
i++;
}
j--;
while((arr[i] + arr[j]) >= sum && i < j)
{
if((arr[i] + arr[j]) == sum)
cout << "(" << arr[i] << "," << arr[j] << ")" << endl;
j--;
}
}
}
while((arr[i] + arr[j]) <= sum && i < j)
deve serwhile( i < J && arr[i] + arr[j] <= sum )
. (semelhante para a segunda subloop)Respostas:
fonte
arr=[1,2,1,2,1,2,1,...]
. Por exclusividade por valor, parece que outra tabela de hash codificada por um par de valores faria o truque. Ainda é uma resposta agradável, compacta e elegante. 1hash(K - arr[i]) != i
alguma forma, verifica a presença e a falta de correspondência? Eu esperaria que houvesse uma verificação separada da presença.Existem 3 abordagens para esta solução:
Seja a soma T e n seja o tamanho da matriz
Abordagem 1:
A maneira ingênua de fazer isso seria verificar todas as combinações (n, escolha 2). Essa busca exaustiva é O (n 2 ).
Abordagem 2:
Uma maneira melhor seria classificar a matriz. Isso leva O (n log n).
Em seguida, para cada x na matriz A, use a pesquisa binária para procurar por Tx. Isso levará O (nlogn).
Portanto, a pesquisa geral é O (n log n)
Abordagem 3:
A melhor maneira seria inserir todos os elementos em uma tabela de hash (sem classificação). Isso leva O (n) como inserção de tempo constante.
Então, para cada x, podemos apenas procurar seu complemento, Tx, que é O (1).
No geral, o tempo de execução dessa abordagem é O (n).
Você pode consultar mais aqui . Obrigado.
fonte
Implementação em Java: usando o algoritmo de codaddict (talvez um pouco diferente)
Para input =
{2,45,7,3,5,1,8,9}
e se Sum for10
Pares de saída:
Algumas notas sobre a solução:
fonte
put(k-input[i], input[i])
(codaddicts coloca o índice como um valor útil). O que você escreveu pode ser simplificado parafor (i:input){ if (intSet.contains(sum-i) { print(i + "," + (sum-i) ); } else {intSet.add(i)}
Solução em java. Você pode adicionar todos os elementos String a um ArrayList de strings e retornar a lista. Aqui estou imprimindo.
fonte
Implementação de Python:
Resultado:
fonte
C ++ 11, complexidade do tempo de execução O (n):
fonte
Aqui está uma solução que leva em consideração entradas duplicadas. Está escrito em javascript e assume que a matriz está classificada. A solução é executada no tempo O (n) e não usa nenhuma memória extra além da variável.
Eu resolvi isso durante uma entrevista para uma grande corporação. Eles pegaram, mas não eu. Então aqui está para todos.
Comece nos dois lados da matriz e trabalhe lentamente para dentro, certificando-se de contar duplicatas, se existirem.
Ele conta apenas pares, mas pode ser retrabalhado para
Aproveitar!
fonte
if(distI > distK) while(_arr[++i]==curI); else while(_arr[--k]==curK);
Em)
Metodologia: a + b = c, então, em vez de procurar (a, b), procuramos a = c - b
fonte
Implementação em Java: Usando o algoritmo de codaddict:
Resultado:
Se você quiser pares duplicados (por exemplo: 80,80) , basta remover && (Integer) mapping.get (ka [i])! = I da condição if e você estará pronto.
fonte
Acabei de participar desta pergunta no HackerRank e aqui está a minha solução 'Objective C' :
Espero que ajude alguém.
fonte
esta é a implementação de O (n * lg n) usando a implementação de pesquisa binária dentro de um loop.
fonte
Em python
fonte
Ótima solução do Codeaddict. Tomei a liberdade de implementar uma versão em Ruby:
Para permitir pares duplicados (1,5), (5,1), basta remover a
&& !result[sum-l]
instruçãofonte
Aqui está o código Java para três abordagens:
1. Usando o Mapa O (n), o HashSet também pode ser usado aqui.
2. Classifique a matriz e use BinarySearch para procurar o complemento O (nLog (n))
3. BruteForce tradicional dois loops O (n ^ 2)
fonte
Um programa simples em java para matrizes com elementos exclusivos:
fonte
Um trecho de código Java simples para imprimir os pares abaixo:
fonte
Outra solução no Swift: a idéia é criar um hash que armazene valores de (sum - currentValue) e compare isso com o valor atual do loop. A complexidade é O (n).
fonte
Minha solução - Java - Sem duplicatas
fonte
Isso imprime os pares e evita duplicatas usando manipulação bit a bit.
fonte
Eu ignorei a manipulação de bits e apenas comparei os valores do índice. Isso é menor que o valor da iteração do loop (i neste caso). Isso não imprimirá os pares duplicados e os elementos duplicados da matriz também.
fonte
em c #:
fonte
Uma solução pode ser essa, mas não otimizada (a complexidade desse código é O (n ^ 2)):
fonte
Uma versão python simples do código que localiza uma soma de zero e pode ser modificada para encontrar k:
A complexidade do tempo de execução da função é O (n) e Espaço: O (n) também.
fonte
fonte
menos que o (n) solução será =>
fonte
Solução em Python usando compreensão de lista
O (N 2 )
também fornece dois pares ordenados- (a, b) e (b, a) também
fonte
I am not sure … Thanks for comments
). Você pode indicar a facada na complexidade mais próxima de O (n²).Eu posso fazer isso em O (n). Deixe-me saber quando você quer a resposta. Note que envolve simplesmente percorrer o array uma vez sem classificação, etc ... Devo mencionar também que ele explora a comutatividade da adição e não usa hashes, mas desperdiça memória.
using System; using System.Collections.Generic;
/ * Existe uma abordagem O (n) usando uma tabela de pesquisa. A abordagem é armazenar o valor em uma "lixeira" que possa ser facilmente pesquisada (por exemplo, O (1)) se for um candidato a uma soma apropriada.
por exemplo,
para cada a [k] na matriz, simplesmente a colocamos em outra matriz no local x - a [k].
Suponha que temos [0, 1, 5, 3, 6, 9, 8, 7] e x = 9
Criamos uma nova matriz,
valor dos índices
ENTÃO, os únicos valores que importam são os que possuem um índice na nova tabela.
Então, digamos que quando atingirmos 9 ou igual, veremos se nossa nova matriz possui o índice 9 - 9 = 0. Como sabemos que todos os valores que ela contém serão adicionados a 9. (observe que nessa causa é óbvio que há apenas 1 possível, mas pode ter vários valores de índice que precisamos armazenar).
Então, efetivamente, o que acabamos fazendo é ter que passar pelo array apenas uma vez. Como a adição é comutativa, teremos todos os resultados possíveis.
Por exemplo, quando chegamos a 6, obtemos o índice em nossa nova tabela como 9 - 6 = 3. Como a tabela contém esse valor de índice, conhecemos os valores.
Isso é basicamente trocar a velocidade pela memória. * /
fonte
Solução Javascript:
fonte
https://github.com/clockzhong/findSumPairNumber
Fiz isso sob o custo de complexidade O (m + n) para tempo e espaço de memória. Eu suspeito que esse seja o melhor algoritmo até agora.
fonte
int [] arr = {1,2,3,4,5,6,7,8,9,0};
var z = (de a em arr de b em arr onde 10 - a == b selecione novo {a, b}). ToList;
fonte