"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Chroniques de codage dactylographié : augmentation de la sous-séquence de triplet

Chroniques de codage dactylographié : augmentation de la sous-séquence de triplet

Publié le 2024-07-30
Parcourir:730

Typescript Coding Chronicles: Increasing Triplet Subsequence

É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

Exemple 1:

  • Entrée : nombres = [1,2,3,4,5]
  • Sortie : vrai
  • Explication : tout triplet où i

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

Contraintes:

  • 1
  • -2^31

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

Code:

function increasingTripletBruteForce(nums: number[]): boolean {
    const n = nums.length;
    for (let i = 0; i 



Analyse de la complexité temporelle :

  • Complexité temporelle : O(n^3), où n est la longueur du tableau. En effet, nous vérifions tous les triplets possibles.
  • Complexité spatiale : O(1), car nous n'utilisons aucun espace supplémentaire.

Limites:

La solution par 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 



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 :

  1. Le tableau est par ordre décroissant.
  2. Le tableau contient exactement trois éléments par ordre croissant.
  3. Le tableau comporte un grand nombre d'éléments sans triplet croissant.
  4. 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

Stratégies générales de résolution de problèmes :

  1. Comprendre le problème : Lisez attentivement l'énoncé du problème pour comprendre les exigences et les contraintes.
  2. 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.
  3. Optimiser pour l'efficacité : Utilisez des algorithmes et des structures de données efficaces pour minimiser la complexité temporelle et spatiale.
  4. Testez de manière approfondie : Testez la solution avec divers cas, y compris les cas extrêmes, pour garantir son exactitude.

Identifier des problèmes similaires :

  1. Problèmes de sous-tableau :

    • Problèmes pour lesquels vous devez trouver des sous-tableaux avec des propriétés spécifiques.
    • Exemple : Recherche du sous-tableau de somme maximale (algorithme de Kadane).
  2. 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é.
  3. 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 étapes.

Conclusion:

  • Le problème de la recherche d'une sous-séquence de triplet croissante 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 intrants importants.
  • Les tests avec différents cas extrêmes garantissent la robustesse.
  • Reconnaître les tendances 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.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/__zamora__/typescript-coding-chronicles-increasing-triplet-subsequence-207l?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3