Problème
Retournez la deuxième plus grande valeur distincte de la liste. Les valeurs répétées ne comptent qu'une seule fois.
Implémentez second_largest(numbers).
Entrée
numbers : Une liste d'entiers non négatifs.
Sortie
Retournez la deuxième plus grande valeur distincte, ou -1 si elle n'existe pas.
Contraintes
0 ≤ longueur ≤ 100 000 ; 0 ≤ chaque valeur ≤ 10⁹
Exemples
Entrée :
numbers = [4, 9, 7, 9]
Sortie attendue :
expected = 7
Entrée :
std::vector<long long> numbers = {4, 9, 7, 9};
Sortie attendue :
long long expected = 7;
Entrée :
long[] numbers = new long[] {4, 9, 7, 9};
Sortie attendue :
long expected = 7;
Explication
Les valeurs distinctes sont 9, 7, 4 ; la deuxième plus grande est 7.
Entrée :
numbers = [5, 5]
Sortie attendue :
expected = -1
Entrée :
std::vector<long long> numbers = {5, 5};
Sortie attendue :
long long expected = -1;
Entrée :
long[] numbers = new long[] {5, 5};
Sortie attendue :
long expected = -1;
Explication
Il n'existe qu'une seule valeur distincte, donc la réponse est -1.
Comment l'aborder
Essayez d'abord seul, puis ouvrez les indices un par un.
Indice 1
Il vous faut la plus grande valeur et la suivante différente, pas seulement les deux premières positions.
Indice 2
Suivez deux maxima distincts en parcourant la liste, en les mettant à jour quand une nouvelle valeur se place au-dessus ou entre eux.
Indice 3
Si aucune deuxième valeur distincte n’apparaît, retournez la valeur de secours spéciale.
Complexité attendue
temps O(n), espace supplémentaire O(1)
Références
Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.