Maison >interface Web >js tutoriel >Chroniques de codage dactylographié : augmentation de la sous-séquence de triplet
É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.
Pouvez-vous implémenter une solution qui s'exécute dans une complexité temporelle O(n) et une complexité spatiale O(1) ?
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.
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.
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; }
La solution force brute n'est pas efficace et n'est pas adaptée aux grandes tailles d'entré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.
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; }
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
Problèmes de sous-réseau :
Technique à deux pointeurs :
Algorithmes sur place :
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!