Escrito por Lúcio Figueiredo
Conhecimento prévio necessário:
Imagine que existem quatro índices do vetor de modo que
. Assuma que
. Vamos fixar os índices
e
, ou seja, em
, vamos iterar por cada par de índices do vetor e fixá-los como
e
. Agora, queremos descobrir se existe um par
de modo que
e
sejam menores que
e
e de modo que a soma dos 4 índices seja
, ou seja,
.
Para encontrar os índices (se existirem), podemos utilizar um map de inteiros para pares que guarda, para cada soma
, um par de índices com tal soma (ou seja,
tal que
). Para garantir que os índices
serão distintos, é necessário cuidado ao armanezar os valores no map. Iremos iterar por cada indíce
de
a
mantendo a propriedade de que armazenamos no map todas as somas utilizando apenas índices menores que
. Assim, dentro do loop que itera pelo índice
, podemos fixar o índice
e tentar encontrar, usando o map, um par de inteiros com soma igual a
. Caso seja possível encontrar tal soma no map, conseguimos encontrar 4 índices com soma igual a
:
e o par contido em
.
Caso não encontremos os 4 índices utilizando o indíce , temos que incluir no map as somas com
e
para
. Para isso, basta iterar por todo
e indicar que
. Agora que o map foi atualizado, podemos tentar encontrar uma soma igual a
que utiliza índices maiores que
.
A complexidade final da solução é
, já que utilizamos um map dentro de loops em
.
Confira o código abaixo para melhor entendimento: