Étant donné un tableau de n nombres entiers et un nombre X, trouvez toutes les paires uniques d'éléments (a,b), dont la somme est égale à X.
La solution suivante est ma solution, elle est O(nLog(n)+n), mais je ne suis pas sûr qu'elle soit optimale ou non.
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--;
}
}
}
3 votes
Une solution O(n) est possible si vous placez tout dans un ensemble O(1) au lieu de trier le tableau.
1 votes
@Anon Pouvez-vous nous donner plus de détails sur la façon de construire un tel ensemble ?
3 votes
Utilisez des hachages. La plupart des langages auront un HashSet amorti O(1) quelque part dans leurs bibliothèques standard.
15 votes
Un mineur nit - O(nLog(n)+n) est O(nLog(n)). La notation Big O ne retient que le terme dominant et laisse tomber tous les termes d'ordre inférieur.
2 votes
Notez l'évaluation des courts-circuits et l'adressage off-by-one :
while((arr[i] + arr[j]) <= sum && i < j)
devrait êtrewhile( i < J && arr[i] + arr[j] <= sum )
. (similaire pour la deuxième sous-boucle)0 votes
J'ai un doute, dans la deuxième boucle, pourquoi n'avez-vous pas ajouté i++ à la fin comme vous avez ajouté j-- dans le premier cas, je demande juste si vous avez oublié ou si cela ne devrait pas être. Je n'ai aucune idée de la raison pour laquelle ce ne devrait pas être le cas.
0 votes
@Gin Je pense que la décrémentation de l'indice j entre les 2 boucles while est redondante - avez-vous ajouté cela comme une optimisation ?
0 votes
Values.Where(x => values.Contains(sum - x)).Select(x=> new{x,y=sum-x}) ;
0 votes
Vote pour la réouverture car 1) la question est assez populaire 2) elle est liée comme réponse dans d'autres questions. Le statut "Fermé" donne une fausse impression que la question est inutile.