Guia Senior
Primeiro você faz os treinos (entender o porquê do código). Depois você faz exercícios no compilador e só avança quando passar nos testes.
Treinos
Prefix Sum + Hashing (contagem de subarrays)
Contar subarrays com soma alvo usando prefixos acumulados e mapa de frequências.
Subarray Sum Equals K (ideia)
export function subarraySumIdea(nums, k) { const freq = new Map(); freq.set(0, 1); let pref = 0, count = 0; for (const n of nums) { pref += n; count += freq.get(pref - k) ?? 0; freq.set(pref, (freq.get(pref) ?? 0) + 1); } return count;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Minimum Window Substring (janela variável)
Manter contadores do alvo e uma janela que expande/contrai até cobrir todos os caracteres.
Janela variável (ideia)
export function minWindowIdea(s, t) { const need = new Map(); for (const ch of t) need.set(ch, (need.get(ch) ?? 0) + 1); let have = 0, needCount = t.length; let best = [0, Infinity]; let l = 0; for (let r = 0; r < s.length; r++) { const c = s[r]; if (need.has(c)) { const v = need.get(c) - 1; need.set(c, v); if (v >= 0) have++; } while (have === needCount) { if (r - l < best[1] - best[0]) best = [l, r + 1]; const d = s[l++]; if (need.has(d)) { const v = need.get(d) + 1; need.set(d, v); if (v > 0) have--; } } } return best[1] === Infinity ? "" : s.slice(best[0], best[1]);}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Graphs: Topological (ciclo e ordenação)
Detectar ciclos e decidir ordem com Kahn (in-degree) ou DFS com marcas.
Kahn (ideia simplificada)
export function canFinishIdea(n, prereq) { const indeg = Array(n).fill(0); const adj = Array.from({ length: n }, () => []); for (const [a, b] of prereq) { adj[b].push(a); indeg[a]++; } const q = []; for (let i = 0; i < n; i++) if (indeg[i] === 0) q.push(i); let seen = 0; while (q.length) { const u = q.shift(); seen++; for (const v of adj[u]) if (--indeg[v] === 0) q.push(v); } return seen === n;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Binary Search na Resposta
Buscar a menor resposta k que satisfaz um predicado monotônico.
Koko (ideia)
export function minSpeedIdea(piles, h) { let lo = 1, hi = Math.max(...piles); const ok = (k) => { let t = 0; for (const p of piles) t += Math.ceil(p / k); return t <= h; }; while (lo < hi) { const mid = Math.floor((lo + hi) / 2); if (ok(mid)) hi = mid; else lo = mid + 1; } return lo;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Selection (Quick Select)
Selecionar o k-ésimo maior em média O(n) com partição.
Quick Select (ideia)
export function kthIdea(a, k) { const idx = a.length - k; const b = a.slice(); let lo = 0, hi = b.length - 1; while (true) { const p = b[lo]; let i = lo, j = hi, t; while (i <= j) { while (b[i] < p) i++; while (b[j] > p) j--; if (i <= j) { t = b[i]; b[i] = b[j]; b[j] = t; i++; j--; } } if (idx <= j) hi = j; else if (idx >= i) lo = i; else return b[idx]; }}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Clone Graph (lista de adjacência)
Clonar estrutura mantendo as listas de adjacência equivalentes.
DFS/BFS em adjacência (ideia)
export function cloneAdjIdea(adj) { const n = adj.length; const out = Array.from({ length: n }, () => []); for (let i = 0; i < n; i++) out[i] = adj[i].slice(); return out;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Precisão e escala (BigInt + módulo)
Em strings grandes, o número de pares pode crescer como O(n²). Em JS, Number perde precisão; use BigInt.
Base para operações com BigInt
const MOD = 1000000007n; export function modMul(a, b) { return (a * b) % MOD;} export function modAdd(a, b) { return (a + b) % MOD;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Trees: Lowest Common Ancestor (BST)
Explorar propriedade de BST para descer à esquerda/direita até encontrar o LCA.
LCA em BST (ideia)
export function lcaBstIdea(root, p, q) { let cur = root; while (cur) { if (p < cur.val && q < cur.val) cur = cur.left; else if (p > cur.val && q > cur.val) cur = cur.right; else return cur?.val ?? null; } return null;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Exercícios
Quick Select (k-th maior)
Função: findKthLargest()
Abrir no compilador →
Capacity to Ship Packages Within D Days
Função: shipWithinDays()
Abrir no compilador →
Clone Graph (lista de adjacência)
Função: cloneGraphAdj()
Abrir no compilador →
Minimum Errors (subsequências + BigInt)
Função: minimumErrors()
Abrir no compilador →
Subarray Sum Equals K (prefix sum + Map)
Função: subarraySum()
Abrir no compilador →
Minimum Window Substring (janela variável)
Função: minWindow()
Abrir no compilador →
Course Schedule (Kahn/DFS)
Função: canFinish()
Abrir no compilador →
Lowest Common Ancestor (BST)
Função: lowestCommonAncestor()
Abrir no compilador →
Koko Eating Bananas (Binary Search na resposta)
Função: minEatingSpeed()
Abrir no compilador →
Jump Game II (Greedy)
Função: jump()
Abrir no compilador →
Permutation Sorter (OA) — shifts + reverse
Função: minOpsPermutationSorter()
Abrir no compilador →