Algoritmos e Estruturas de Dados

✨ Nível

🕗 Duração

💻 Prática

Intermédio

4-8 meses

400+ exercícios de programação

Bem-vindo(a) a um curso completo de Algoritmos e Estruturas de Dados. Quando terminares o curso, terás conhecimento suficiente para otimizar drasticamente os teus programas, desenvolver uma intuição sobre a eficiência de cada um e destacar-te em entrevistas em grandes empresas de tecnologia, como Google, Meta, Amazon, entre outras. O curso começa com as bases de algoritmos e estruturas de dados e aprofunda-se nos tópicos mais populares desta área.

martin97_A_wallpaper_with_formulas_math_and_connected_graph_wit_5dd4aca4-53a3-4f89-9a57-b4172fd477cc.jpg
top-tech-companies.png

Grandes empresas de tecnologia, como Google, Meta, Netflix e Amazon, realizam entrevistas que exigem um conhecimento profundo de estruturas de dados e algoritmos. Ao concluíres este curso, ficarás preparado(a) para essas entrevistas.

Plataformas de freelancer como Toptal ou Turing requerem que os seus candidatos sejam fluentes em Estruturas de Dados e Algoritmos. Por isso, os seus processos de seleção incluem várias entrevistas focadas em conhecimentos algorítmicos.

📚 Pré-requisitos

Este curso foi desenhado para quem já tem alguma experiência numa linguagem de programação de uso geral (como Python, C++, Java ou C#) e pretende aprofundar conhecimentos no mundo de algoritmos e estruturas de dados. Antes de começares o curso, deves sentir-te à vontade para trabalhar com ciclos (loops), criar funções e utilizar as estruturas de dados embutidas (como listas, conjuntos ou mapas).

🤩 Resultados

No final deste curso, saberás como usar diversas estruturas de dados populares para escrever algoritmos eficientes, capazes de se desempenhar muito mais depressa do que soluções ingénuas. Vamos abordar as melhores práticas para escrever código de algoritmos e explicar como te preparares para entrevistas de caráter algorítmico.

Este curso foca-se na compreensão completa de cada conceito. Vais trabalhar com diferentes algoritmos e implementar variações para resolver muitos problemas, dominando cada um deles de forma aprofundada.

💻 Aprende Fazendo

Neste curso, vais aprender fazendo! Cada conceito apresenta vários desafios interativos que terás de resolver para avançares para o seguinte. Na verdade, são mais de 400 problemas de programação prática neste curso. Acreditamos que aprender com prática constante é a melhor forma de obter um conhecimento profundo. Aqui, terás exercícios tanto desafiantes como interessantes, para treinares cada conceito abordado.

⚡ Estuda Ao Teu Ritmo

Podes investir bastante tempo e completar vários níveis numa semana, ou avançar mais devagar e focar-te em cada conceito durante mais tempo. Decide tu o ritmo que faz mais sentido. A única exigência para concluir o curso com sucesso é consistência. Praticar 1 ou 2 horas todos os dias traz muito mais resultados do que dedicar apenas um dia por semana durante várias horas.

Para que não fiques bloqueado, existe um fórum para colocar perguntas. Nele, podes pedir ajuda ou ajudar outros, respondendo às suas questões nos desafios.

🎓 Currículo

Este curso concentra-se nos conceitos essenciais de Estruturas de Dados e Algoritmos, introduzindo cada um deles de forma intuitiva. Para tornar o processo mais divertido e envolvente, organizámos os conceitos em níveis, e completar cada nível significa que já dominaste um novo tópico. Eis os principais assuntos que vamos abordar:

Problemas de implementação
  • O algoritmo está diretamente descrito no enunciado

  • Uso de estruturas de dados básicas como arrays, dicionários, conjuntos, etc.

Operações bitwise
  • Representação binária de números (int → bin, bin → int)

  • Números negativos em binário

  • Operações bitwise OR, AND, XOR

  • Representação em base-k (base-10 → base-k, base-k → base-10)

Prefix sums
  • Prefix sum em 1D

  • Prefix sum em 2D

Janela deslizante / Dois ponteiros
  • Janela deslizante para encontrar a soma

  • Janela deslizante para encontrar valores únicos

Teoria dos números
  • Verificação de primalidade - ,

  • Crivo de Eratóstenes (Sieve of Eratosthenes)

  • Fatorização em primos

  • Máximo Divisor Comum (GCD) e Mínimo Múltiplo Comum (LCM)

  • Aritmética modular

Pesquisa binária
  • Pesquisa linear VS pesquisa binária

  • Encontrar um valor num array ordenado com pesquisa binária

  • Encontrar um número de ponto flutuante com precisão

  • Incluir a fronteira esquerda VS incluir a fronteira direita na resposta

  • Binary search para encontrar a resposta

Ordenação
  • Bogosort

  • Selection sort

  • Insertion sort

  • Bubble sort

Algoritmos gananciosos (Greedy)
  • Seguir uma estratégia gananciosa

  • Heurísticas gananciosas

Programação dinâmica
  • Programação dinâmica 1D (Fibonacci, etc.)

  • Problema de troco (moedas mínimas)

  • Problema de troco (número de formas)

Recursão
  • Fatores de ramificação

  • Códigos de Gray

  • Torres de Hanói

  • Divisão recursiva de um problema em subproblemas

Divide & Conquer & Ordenação avançada
  • Merge sort

  • Quick sort

  • Ordenação in-place

  • A complexidade de ordenação baseada em comparação é sempre ≥

Linked List
  • Nós e ligações

  • Percurso e pesquisa

  • Eliminar e inserir elementos

Queue & Stack
  • Ordem de inserção e remoção

  • Otimização de pesquisa com uma stack

Árvore Binária & Binary Search Tree (BST)
  • Construção de uma árvore binária

  • Pesquisa numa árvore binária

  • Atualizar e eliminar elementos de uma árvore

Heap
  • Heapify

  • Heap sort

Hashing
  • Funções de hashing

  • Colisões

Programação Dinâmica Avançada
  • Edit Distance (distância de edição)

  • Problema da Mochila (Knapsack)

  • Longest Increasing Subsequence (subsequência crescente máxima)

  • Multiplicação eficiente de n matrizes

Representações de Grafos
  • Matriz de adjacência

  • Lista de adjacência

  • Lista de arestas

  • Graus dos vértices

Breadth-First Search (BFS)
  • BFS em grafos

  • Encontrar o caminho mais curto

  • BFS em grelhas

  • BFS noutros tipos de estruturas

Depth-First Search (DFS)
  • Verificar se é conexo

  • Ciclos

  • Ordenação topológica

  • Bipartição

Trie
  • Pesquisa de strings

Dijkstra
  • Encontrar o caminho mais curto num grafo com pesos

  • Truques para usar em diferentes problemas, simplificando e melhorando o desempenho de um programa

Backtracking
  • N Queens

  • Coloração de grafos

  • Preenchimento de grelhas com valores

Segment Tree
  • Segment tree básica - construção, obtenção de valores, atualização

  • Consultas em intervalos e atualizações de valores

  • Binary search num prefixo

  • Guardar vários valores num nó

  • Pré-processar a entrada e depois utilizar uma segment tree

Complexidade de Algoritmos
  • Notação Big formalizada

  • P vs NP

🚀 Bem-vindo(a)

Aprender depende 80% do teu próprio trabalho. Concluir este curso será um grande feito, e estamos aqui para te apoiar ao longo dessa jornada!