Énoncé du problème :
Étant donné un tableau d'entiers nums, renvoie true s'il existe un triplet d'indices (i, j, k) tel que i < j &Lt ; k et nums[i] ≪ nums[j] ≪ chiffres[k]. Si de tels indices n'existent pas, renvoyez false.
Exemple 1 :
- Entrée : nombres = [1,2,3,4,5]
- Sortie : vrai
- Explication : Tout triplet où i < j &Lt ; k est valide.
Exemple 2 :
- Entrée : nombres = [5,4,3,2,1]
- Sortie : faux
- Explication : Aucun triplet n'existe.
Exemple 3 :
- Entrée : nombres = [2,1,5,0,4,6]
- Sortie : vrai
- Explication : Le triplet (3, 4, 5) est valide car nums[3] == 0 < nums[4] == 4 < nums[5] == 6.
Contraintes :
- 1 <= nums.length <= 5 * 10^5
- -2^31 <= nums[i] <= 2^31 - 1
Suivi:
Pouvez-vous implémenter une solution qui s'exécute dans une complexité temporelle O(n) et une complexité spatiale O(1) ?
Processus de réflexion initial :
Pour résoudre ce problème efficacement, nous devons garder une trace des plus petites et des deuxièmes plus petites valeurs rencontrées jusqu'à présent. Si nous trouvons une troisième valeur supérieure à la deuxième plus petite, alors nous avons trouvé un triplet croissant.
Solution de base (force brute) :
La solution par force brute consiste à vérifier tous les triplets possibles pour voir s'il en existe un qui satisfait à la condition i < j &Lt ; k et nums[i] ≪ nums[j] ≪ nombres[k]. Cette approche a une complexité temporelle de O(n^3), ce qui n'est pas efficace pour les grandes tailles d'entrée.
Code:
function increasingTripletBruteForce(nums: number[]): boolean {
const n = nums.length;
for (let i = 0; i < n - 2; i++) {
for (let j = i + 1; j < n - 1; j++) {
for (let k = j + 1; k < n; k++) {
if (nums[i] < nums[j] && nums[j] < nums[k]) {
return true;
}
}
}
}
return false;
}
Copier après la connexion
Analyse de la complexité temporelle :
-
Complexité temporelle : O(n^3), où n est la longueur du tableau. C'est parce que nous vérifions tous les triplés possibles.
-
Complexité spatiale : O(1), car nous n'utilisons aucun espace supplémentaire.
Limites:
La solution force brute n'est pas efficace et n'est pas adaptée aux grandes tailles d'entrée.
Solution optimisée :
La solution optimisée consiste à parcourir le tableau tout en conservant deux variables, la première et la seconde, qui représentent les plus petites et les deuxièmes plus petites valeurs rencontrées jusqu'à présent. Si nous trouvons une valeur supérieure à la seconde, alors nous renvoyons vrai.
Code:
function increasingTriplet(nums: number[]): boolean {
let first = Infinity;
let second = Infinity;
for (let num of nums) {
if (num <= first) {
first = num; // smallest value
} else if (num <= second) {
second = num; // second smallest value
} else {
return true; // found a value greater than second smallest, thus an increasing triplet exists
}
}
return false;
}
Copier après la connexion
Analyse de la complexité temporelle :
-
Complexité temporelle : O(n), où n est la longueur du tableau. Nous parcourons le tableau une fois.
-
Complexité spatiale : O(1), car nous n'utilisons qu'une quantité constante d'espace supplémentaire.
Améliorations par rapport à la solution de base :
- Cette solution s'exécute en temps linéaire et utilise un espace constant, ce qui la rend optimale pour les contraintes données.
Cas extrêmes et tests :
Cas extrêmes :
- Le tableau est par ordre décroissant.
- Le tableau contient exactement trois éléments par ordre croissant.
- Le tableau comporte un grand nombre d'éléments sans triplet croissant.
- Le tableau contient des doublons.
Cas de tests :
console.log(increasingTripletBruteForce([1,2,3,4,5])); // true
console.log(increasingTripletBruteForce([5,4,3,2,1])); // false
console.log(increasingTripletBruteForce([2,1,5,0,4,6])); // true
console.log(increasingTripletBruteForce([1,1,1,1,1])); // false
console.log(increasingTripletBruteForce([1,2])); // false
console.log(increasingTripletBruteForce([1,2,3])); // true
console.log(increasingTripletBruteForce([1,5,0,4,1,3])); // true
console.log(increasingTriplet([1,2,3,4,5])); // true
console.log(increasingTriplet([5,4,3,2,1])); // false
console.log(increasingTriplet([2,1,5,0,4,6])); // true
console.log(increasingTriplet([1,1,1,1,1])); // false
console.log(increasingTriplet([1,2])); // false
console.log(increasingTriplet([1,2,3])); // true
console.log(increasingTriplet([1,5,0,4,1,3])); // true
Copier après la connexion
Stratégies générales de résolution de problèmes :
-
Comprendre le problème : Lisez attentivement l'énoncé du problème pour comprendre les exigences et les contraintes.
-
Identifier les opérations clés : Déterminez les opérations clés nécessaires, telles que le suivi des plus petites et des deuxièmes plus petites valeurs.
-
Optimiser pour l'efficacité : Utilisez des algorithmes et des structures de données efficaces pour minimiser la complexité temporelle et spatiale.
-
Testez minutieusement : Testez la solution avec divers cas, y compris les cas extrêmes, pour garantir son exactitude.
Identifier des problèmes similaires :
-
Problèmes de sous-réseau :
- Problèmes pour lesquels vous devez trouver des sous-tableaux avec des propriétés spécifiques.
- Exemple : Trouver le sous-tableau de somme maximale (algorithme de Kadane).
-
Technique à deux pointeurs :
- Problèmes pour lesquels l'utilisation de deux pointeurs peut aider à optimiser la solution.
- Exemple : Suppression des doublons d'un tableau trié.
-
Algorithmes sur place :
- Problèmes où les opérations doivent être effectuées sur place avec un espace supplémentaire limité.
- Exemple : Rotation d'un tableau vers la droite de k pas.
Conclusion:
- Le problème de la recherche d'une sous-séquence croissante de triplet peut être résolu efficacement en utilisant à la fois une approche par force brute et une solution optimisée avec un temps linéaire et une complexité spatiale constante.
- Comprendre le problème et le décomposer en parties gérables est crucial.
- L'utilisation d'algorithmes efficaces garantit que la solution est optimale pour les entrées importantes.
- Les tests avec différents cas extrêmes garantissent la robustesse.
- Reconnaître les schémas des problèmes peut aider à appliquer des solutions similaires à d'autres défis.
En pratiquant de tels problèmes et stratégies, vous pouvez améliorer vos compétences en résolution de problèmes et être mieux préparé à relever divers défis de codage.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!