Problema
Dada uma lista de números e um número k, retorne true caso existam dois números da lista que somados resultam em k.
Por exemplo, dada a lista [10, 15, 3, 7] e k = 17, o retorno deve ser true pois 10 + 7 é 17.
Resolução
Considerando que queremos achar dois números que somados resultam o mesmo valor de k, podemos considerar que temos uma expressão de soma simples, como abaixo:
k = a + b
Essa expressão, pode ser reescrita como:
a - k = b
Existem no PHP ao menos três formas de fazer isso, vou listar todas as três:
1 - A primeira e a que considero menos ideal é usar array_flip e transformar os valores em chaves, possibilitando o uso do isset em um foreach.
$array = array_flip([10, 15, 3, 7]);
$k = 25;
foreach ($array as $key => $num) {
if (isset($array[$k - $key])) {
echo 'true';
break;
}
}
2 - Podemos ainda usar o foreach com um in_array, sem necessidade do array_flip.
$array = [10, 15, 3, 7];
$k = 25;
foreach ($array as $key => $num) {
if (in_array($k - $key, $array)) {
echo 'true';
}
}
3 - Ou ainda usar uma função que faz uso de loops aninhados para verificar os valores.
/**
* @param array $array
* @param int $k
* @return bool
*/
function twosum(array $array, int $k): bool
{
foreach ($array as $key => $value) {
foreach ($array as $key2 => $value2) {
if ($value + $value2 == $k) {
return true;
}
}
}
return false;
}
$array = [10, 15, 3, 7, 2];
$k = 17;
var_dump(twosum($array, $k));
Top comments (0)