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.
notion image
notion image
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

🔥
O objetivo de aprender algoritmos não é apenas estudar teoria. O objetivo é desenvolver capacidades de resolução de problemas.
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!