Dado um std::vector
dos elementos distintos classificados em ordem crescente, quero desenvolver um algoritmo que determine se há dois elementos na coleção cuja soma é um determinado valor sum
,.
Eu tentei duas abordagens diferentes com suas respectivas vantagens e desvantagens:
Posso digitalizar o vetor inteiro e, para cada elemento do vetor, aplicar search binário (
std::lower_bound
) no vetor para pesquisar um elemento correspondente à diferença entresum
e o elemento atual. Esta é uma solução de tempo O (n log n) que não requer espaço adicional.Eu posso atravessar o vetor inteiro e preencher um
std::unordered_set
. Então, digitalizo o vetor e, para cada elemento, procurostd::unordered_set
a diferença entresum
e o elemento atual. Como a pesquisa em uma tabela de hash é executada em tempo constante, em média, essa solução é executada em tempo linear. No entanto, essa solução requer espaço linear adicional devido àstd::unordered_set
estrutura de dados.
No entanto, estou procurando uma solução que seja executada em tempo linear e não exija espaço linear adicional. Alguma ideia? Parece que sou forçado a trocar velocidade por espaço.