Dia 2 - Progresso não é linear

Apesar da diferença em relação as datas, o que importa é fazer 100 dias - não necessariamente consecutivos - do desafio. Dessa vez vou focar em um guia de reconhecimento de padrões de problemas do leetcode pelo canal Bitflip

Dica 1 - olhe as restrições (constraints):

Antes de resolver qualquer problema, é recomendado checar as restrições primeiro. Por quê? Bom, você consegue definir a forma como vai atacar o problema. Por exemplo se n for um valor pequeno como 1 <= n <= 20 quer dizer que da pra usar alguns métodos exponenciais O(n^2): - força bruta - backtracking - recursão

Agora se n for um valor grande como 1 <= n <= 10^5 então você precisa de algo mais eficiente, pelo menos O(n): - soluções gulosas - 2 ponteiros - Pilha - dp (programação dinâmica)

Agora se o valor for enorme como 1 <= b <= 10^8, tem que ser O(n log n): - Algum algoritmo matemático - busca binária

Dica 2 - Analise o formato da entrada:

Se o problema te dar que a entrada como uma Árvore, Árvore Binária, ou uma Árvore de Busca Binária (BST). Muito provavelmente a solução vai estar no uso de algoritmos como BFS ou DFS: - Se precisa explorar o caminho completo DFS, ou se falar se é pre-ordem, pós-ordem ou na ordem. - Se precisa checar todos os galhos BFS

Se for um gráfo também entra nesse caso. Usando além do BFS e DFS também o Union Find. E nesse caso usa o UF quando o problema fala de componentes conectados, ou número de grupos.

Se for um vetor ordenado, então usa-se: - 2 ponteiros - Pesquisa binária - Solução gulosas

Agora se for só um vetor não ordenado ou um número, tem que procurar por palavras chaves e pelo contexto do problema.

Dica 3 - Analise o formato da saida:

Tão importante quanto a entrada, é a saída. Por exemplo se o retorno for uma lista de listas - essencialmente uma matriz de informação, ex.: todas as combinações, todos os caminhos, etc - é recomendado uma solução de Backtracking.

Se a saída for um único valor, como o valor máximo, custo mínimo, número de possibilidades. É utilizado ou DP ou solução gulosa.

Se for um vetor modificado, ou uma string - um vetor de char - a solução é 99% 2 ponteiros.

Se for uma lista ordenada, ai obviamente a solução é ordenação (bubble, quick, etc) ou topológica.

Dica 4 - Palavras chave:

Bom o vídeo já disponibilizou uma lista extensa então vou só colar direto aqui:

Aqui está o texto a partir do Passo 4: Reconhecimento de Padrões por Palavra-Chave do documento:

Dynamic Programming Keywords:

  • “Number of ways”
  • “Maximum/minimum” + “sum/profit/cost”
  • “Can you reach”
  • “Longest/shortest subsequence”
  • “Optimal” or “best”

Two Pointers Keywords:

  • “Palindrome”
  • “Sorted array”
  • “Target sum”
  • “Remove duplicates”

Heap Keywords:

  • “K largest” or “K smallest”
  • “Top K elements”
  • “Median”
  • “Priority”

Stack Keywords:

  • “Parentheses” or “brackets”
  • “Valid expression”
  • “Nested structure”
  • “Undo operations”

Monotonic Stack Keywords:

  • “Next greater element”
  • “Next smaller element”

HashMap Keywords:

  • “Count frequency”
  • “Find duplicates”
  • “Anagram”

Trie Keywords:

  • “Word search”
  • “Word prefixes”

Greedy Keywords:

  • “Minimum operations”

Union Find Keywords:

  • “Connected components”
  • “Number of groups”

Binary Search Keywords:

  • “Kth element”
  • “Search in sorted”
  • “Minimize maximum”
  • “First/last occurrence”

Bit Manipulation:

  • “XOR” operations
  • “Single number” problems
  • “Power of 2”

Math/Geometry:

  • “Greatest/Least Common Denominator”
  • “Prime numbers”
  • “Angle calculations”
  • “Coordinate”

Game Theory:

  • “Optimal strategy”
  • “Win/lose scenarios”
  • “Minimax”

Sliding Window:

  • “Substring” with conditions
  • “Subarray” with fixed/variable size
  • “Maximum/minimum window”
  • “Contains all”

Com isso em mente agora posso começar atacando os problemas mais comuns tentando desenvolver a minha intuição.