Two Sum, Anagrammes, Compteur de Fréquence
Utilisez les flĂšches, cliquez ou glissez pour naviguer
1. Appliquer le pattern compteur de fréquence
Un pattern réutilisable dans de nombreux problÚmes
2. Résoudre Two Sum en O(n)
Passer de O(nÂČ) Ă O(n) avec un objet
3. Décomposer un problÚme algorithmique
D'abord simple, puis optimiser
4. Choisir la bonne structure de données
Objet, Map, Set selon le besoin
Récap de la semaine
Complexité, recherche, tri, récursion
Two Sum
Trouver deux nombres qui font une somme cible
Anagrammes
Détecter si deux mots sont des anagrammes
Le compteur de fréquence
Un pattern fondamental avec .reduce() ou objet
Projet : Résoudre des classiques
Combiner les techniques apprises
Complexité
O(1), O(n), O(nÂČ), O(log n)
Recherche
Linéaire vs Binaire
Tri
Bulles, Sélection
Récursion
Cas de base, cas récursif
Ces concepts sont les briques des algorithmes classiques
Two Sum
Utilise la recherche et la complexité
Anagrammes
Utilise le tri ou le compteur
Compteur de fréquence
Pattern réutilisable
Plus longue sous-chaĂźne
Combine tous les concepts
đĄ Aujourd'hui, on combine tout ça pour rĂ©soudre des problĂšmes classiques!
Trouver deux nombres qui font une somme cible
Ătant donnĂ© un tableau [2, 7, 11, 15]
Et une cible 9
Trouver les indices des deux nombres
Réponse : [0, 1] car 2 + 7 = 9
â ïž On commence TOUJOURS par la solution simple!
function twoSum(nums, target) {
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] === target) {
return [i, j];
}
}
}
}
đĄ Pour chaque nombre, on teste avec tous les autres
Deux boucles imbriquées = n à n comparaisons
10 éléments
100
comparaisons
100 éléments
10 000
comparaisons
1000 éléments
1 000 000
comparaisons
â ïž Ăa explose rapidement! Peut-on faire mieux?
Si je cherche 9
Et que j'ai 2
Il me manque 9 - 2 = 7
Le complément de 2 est 7
Si je trouve 7 quelque part â j'ai ma paire!
Stocker les nombres déjà vus dans un objet
Pour chaque nombre, vĂ©rifier si son complĂ©ment existe dĂ©jĂ
function twoSum(nums, target) {
const seen = {};
for (let i = 0; i < nums.length; i++) {
const complement = target - nums[i];
if (complement in seen) {
return [seen[complement], i];
}
seen[nums[i]] = i;
}
}
â Un seul parcours = O(n)!
Tableau : [2, 7, 11, 15]
Ătape 1 : i = 0, nums[0] = 2
Ătape 2 : i = 1, nums[1] = 7
â Retourne [0, 1] â
Brute Force
O(nÂČ)
100 Ă©lĂ©ments â 10 000 ops
1000 Ă©lĂ©ments â 1 000 000 ops
Deux boucles imbriquées
Optimisé
O(n)
100 Ă©lĂ©ments â 100 ops
1000 Ă©lĂ©ments â 1000 ops
Un seul parcours + objet
Pour 1000 éléments : 1000x plus rapide!
Deux mots avec les mĂȘmes lettres rĂ©arrangĂ©es
listen
âïž
silent
race
âïž
care
Si deux mots sont des anagrammes, leurs lettres triées sont identiques
function isAnagram(str1, str2) {
const sorted1 = str1.split('').sort().join('');
const sorted2 = str2.split('').sort().join('');
return sorted1 === sorted2;
}
listen â eilnst
silent â eilnst
Complexité : O(n log n) à cause du tri
Compter combien de fois chaque lettre apparaĂźt
function isAnagram(str1, str2) {
if (str1.length !== str2.length) return false;
const count = {};
for (const char of str1) {
count[char] = (count[char] || 0) + 1;
}
for (const char of str2) {
if (!count[char]) return false;
count[char]--;
}
return true;
}
ComplexitĂ© : O(n) â Un seul parcours par mot!
Les espaces et majuscules faussent le résultat!
"Listen" â "silent"
Majuscule différente
"dormitory" â "dirty room"
Espace en plus
â Solution : Normaliser avant de comparer
const normalize = str => str.toLowerCase().replace(/\s/g, '');
| Approche | Complexité | Avantages |
|---|---|---|
| Trier les lettres | O(n log n) | Code simple, une ligne |
| Compteur de fréquence | O(n) | Plus rapide, pattern réutilisable |
đĄ Le compteur de frĂ©quence est le pattern Ă retenir!
Un pattern fondamental et réutilisable
Compter combien de fois chaque élément apparaßt
// Exemple
['a', 'b', 'a', 'c', 'b', 'a']
â { a: 3, b: 2, c: 1 }
function frequencyCounter(arr) {
return arr.reduce((acc, val) => {
acc[val] = (acc[val] || 0) + 1;
return acc;
}, {});
}
đĄ reduce accumule les comptes dans un objet
Exemple d'utilisation :
frequencyCounter(['a', 'b', 'a', 'c']);
// â { a: 2, b: 1, c: 1 }
function frequencyCounter(arr) {
const count = {};
for (const val of arr) {
count[val] = (count[val] || 0) + 1;
}
return count;
}
đĄ Plus lisible pour les dĂ©butants, mĂȘme complexitĂ© O(n)
â Anagrammes
Comparer les fréquences des lettres
â Trouver les doublons
Fréquence > 1 = doublon
â CaractĂšres uniques
Fréquence = 1 pour tous
â Two Sum
Stocker les nombres vus
đŻ Ce pattern revient PARTOUT dans les entretiens techniques!
Brute force d'abord
Solution simple, mĂȘme si lente
Analyser la complexité
Identifier les goulots d'étranglement
Optimiser
Meilleure structure de données
â Vouloir la solution optimale directement
â Commencer par brute force, puis optimiser
â Ne pas comprendre le "complĂ©ment" dans Two Sum
â Visualiser : target - current = ce qu'on cherche
â Oublier de normaliser les anagrammes
â toLowerCase() + remove spaces
Two Sum : O(nÂČ) â O(n) avec un objet
Stocker les compléments déjà vus
Anagrammes : Trier O(n log n) ou Compter O(n)
Penser Ă normaliser (espaces, majuscules)
Compteur de fréquence = Pattern réutilisable
Doublons, anagrammes, caractĂšres uniques...
DĂ©marche : Brute force â Analyser â Optimiser
Ne pas chercher la solution parfaite du premier coup
Two Sum
Objet pour les compléments
O(n)
Anagrammes
Compter les fréquences
O(n)
Compteur de fréquence
Le pattern Ă maĂźtriser absolument!
1. Two Sum
Implémenter les deux versions et comparer
2. Détecter les anagrammes
Avec tri ET avec compteur de fréquence
3. Trouver les doublons
Utiliser le compteur de fréquence
4. Plus longue sous-chaßne sans répétition
Combiner Set + sliding window
Les algorithmes classiques sont la base de l'algorithmique
Maßtrisez le compteur de fréquence
Et vous résoudrez 50% des problÚmes d'entretien!