Guia Pleno
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
Sliding Window (sem repetição)
Janela que expande e contrai mantendo contagem/últimos índices para evitar repetição.
Longest Substring (ideia)
export function longestSubstringNoRepeatIdea(s) { const last = new Map(); let best = 0; let start = 0; for (let i = 0; i < s.length; i++) { const ch = s[i]; if (last.has(ch) && last.get(ch) >= start) start = last.get(ch) + 1; last.set(ch, i); best = Math.max(best, i - start + 1); } return best;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Dois ponteiros (área máxima)
Mover a borda limitante correta maximiza a chance de aumentar a área.
Container With Most Water (ideia)
export function maxAreaIdea(h) { let i = 0, j = h.length - 1; let best = 0; while (i < j) { const area = Math.min(h[i], h[j]) * (j - i); if (area > best) best = area; if (h[i] < h[j]) i++; else j--; } return best;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Binary Search com invariantes
O erro mais comum é off-by-one. A regra é manter o intervalo (lo, hi) consistente.
Rotated Search (ideia)
export function searchRotatedIdea(a, x) { let lo = 0, hi = a.length - 1; while (lo <= hi) { const mid = lo + Math.floor((hi - lo) / 2); if (a[mid] === x) return mid; if (a[lo] <= a[mid]) { if (a[lo] <= x && x < a[mid]) hi = mid - 1; else lo = mid + 1; } else { if (a[mid] < x && x <= a[hi]) lo = mid + 1; else hi = mid - 1; } } return -1;}Clique em uma linha destacada para ver o motivo daquela escolha.
Lower Bound (hi exclusivo)
export function lowerBound(arr, target) { let lo = 0; let hi = arr.length; while (lo < hi) { const mid = lo + Math.floor((hi - lo) / 2); if (arr[mid] < target) lo = mid + 1; else hi = mid; } return lo;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Sorting (Merge Sort e Quick Sort)
Escolher a estratégia certa: estabilidade do merge sort e praticidade do quick sort.
Quick Sort (ideia)
export function quickSortIdea(a) { if (a.length <= 1) return a.slice(); const p = a[0]; const left = [], eq = [], right = []; for (const x of a) { if (x < p) left.push(x); else if (x > p) right.push(x); else eq.push(x); } return quickSortIdea(left).concat(eq, quickSortIdea(right));}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Linked List (ponteiros)
Reversão e detecção de ciclo com cuidado de ponteiros e variáveis auxiliares.
Reverse (ideia)
export function reverseListIdea(head) { let prev = null; let cur = head; while (cur) { const nxt = cur.next; cur.next = prev; prev = cur; cur = nxt; } return prev;}Clique em uma linha destacada para ver o motivo daquela escolha.
Cycle (Floyd)
export function hasCycleIdea(head) { let slow = head, fast = head; while (fast && fast.next) { slow = slow.next; fast = fast.next.next; if (slow === fast) return true; } return false;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Graphs: BFS/DFS em matriz
Visitar componentes conectados mantendo visited e limites da matriz.
Contar ilhas (ideia DFS)
export function countIslandsIdea(g) { const H = g.length, W = g[0]?.length ?? 0; const seen = Array.from({ length: H }, () => Array(W).fill(false)); const dirs = [[1,0],[-1,0],[0,1],[0,-1]]; const dfs = (r, c) => { const stack = [[r, c]]; seen[r][c] = true; while (stack.length) { const [x, y] = stack.pop(); for (const [dx, dy] of dirs) { const nx = x + dx, ny = y + dy; if (nx>=0 && nx<H && ny>=0 && ny<W && g[nx][ny] === "1" && !seen[nx][ny]) { seen[nx][ny] = true; stack.push([nx, ny]); } } } }; let count = 0; for (let i = 0; i < H; i++) { for (let j = 0; j < W; j++) { if (g[i][j] === "1" && !seen[i][j]) { count++; dfs(i,j); } } } return count;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Trees: Validate BST
Usar in-order crescente ou limites min/max para validar BST.
Limites min/max (ideia)
export function isValidBstIdea(root) { const go = (node, lo, hi) => { if (!node) return true; if ((lo !== null && node.val <= lo) || (hi !== null && node.val >= hi)) return false; return go(node.left, lo, node.val) && go(node.right, node.val, hi); }; return go(root, null, null);}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Exercícios
Lower Bound (Binary Search)
Função: lowerBound()
Abrir no compilador →
Longest Substring Without Repeating Characters
Função: lengthOfLongestSubstring()
Abrir no compilador →
Container With Most Water
Função: maxArea()
Abrir no compilador →
Search in Rotated Sorted Array
Função: searchRotated()
Abrir no compilador →
Number of Islands (BFS/DFS)
Função: numIslands()
Abrir no compilador →
Reverse Linked List
Função: reverseList()
Abrir no compilador →
Linked List Cycle (Floyd)
Função: hasCycle()
Abrir no compilador →
Binary Tree Level Order Traversal
Função: levelOrder()
Abrir no compilador →
Merge Sort (estável)
Função: mergeSort()
Abrir no compilador →
Trapping Rain Water
Função: trap()
Abrir no compilador →
Quick Sort (retorna novo array)
Função: quickSort()
Abrir no compilador →
Subsets (backtracking)
Função: subsets()
Abrir no compilador →
Validate BST
Função: isValidBST()
Abrir no compilador →