This repository contains my implementation of useful / well-known data structures, algorithms and solutions for awesome competitive programming problems in Hackerrank, Project Euler and Leetcode
I create this for faster implementation and better preparation in interviews as well as programming contests
📆 Last updated on 06.04.2021 in Python 3 by Le Duc Khai
-
: Useful / well-known data structures or algorithms
-
: Solutions for some awesome competitive programming problems
Mathematics : Type of the Algorithm
Permutation Problems : Category of the Problem
Lexicographic Permutations : Name of the problem
Awesome-Competitive-Programming
│ README.md
│
└───Folder 1 : Type of Algorithm
│ │ File1.ipynb : Python codes for the problem
│ │ ...
│
└───Folder 2
│ │ File2.ipynb
│ │ ...
│
└───Folder Data Bank: Descriptions and Solution Guides for the Problem
│ │ File1.pdf
│ │ ...
│
└───...
-
- Binary Search Tree: Original Binary Search Tree Algorithm - O(log(n))
-
- Binary Search Tree: Check a Number: Check if a Number is in a Sorted List using BST Algorithm - O(log(n))
-
- Binary Search Tree: Index of a Number: Find the Index of a Number in a Sorted List using BST Algorithm - O(log(n))
-
- Suffix Array (Manber-Myers Algorithm): Find suffix array of a string S based on Manber-Myers algorithm - O(n.log(n)) , n = |S|
-
- Longest Common Prefix Array (Kasai Algorithm): Find longest common prefix array of a string S with the help of suffix array based on Kasai algorithm - O(n) , n = |S|
-
- Longest Palindromic Substring - (O(n)) (Đang cập nhật)
-
- Pattern Search - O(log(n)) (Đang cập nhật)
-
- Graph Representation using Adjacency List: Unweighted, Un-/Directed: Create a Unweighted Un-/Directed Graph using Adjacency List
-
- Graph Representation using Adjacency List: Weighted, Un-/Directed (Đang cập nhật)
-
- Find All Nodes: Find All Nodes in the Unweighted Graph - O(V+E) for Adjacency List , V, E is the number of vertices and edges
-
- Find All Edges (Đang cập nhật)
-
- Find All Paths between 2 Nodes: Find All Paths between 2 Nodes in a Unweighted Graph using BFS - NP-Hard
-
- Disjoint Set (Union-Find): Union by Rank and Path Compression: Create a Disjoint Set (Union-Find) using "Union by Rank and Path Compression" for an Undirected Graph (used to Detect Cycle) - Time = O(small constant), Space = O(V)
-
- Detect Cycle: Disjoint Set: Detect Cycle in an Undirected Graph based on Disjoint Set (Union-Find) using "Union by Rank and Path Compression" - O(V)
-
- Breadth-First Search: Find BFS Path from a Starting Node in Un-/Directed Graph - O(V+E) for Adjacency List; O(V2) for Adjacency Matrix , V, E is the number of vertices and edges
-
- Depth-First Search: Find DFS Path from a Starting Node in Un-/Directed Graph - O(V+E) for Adjacency List; O(V2) for Adjacency Matrix , V, E is the number of vertices and edges
-
- MST: Prim Algorithm[PDF]: Find Minimum Spanning Tree (MST) of an Undirected Graph using Prim Algorithm - O(E.log(V))
-
- MST: Kruskal Algorithm[PDF]: Find Minimum Spanning Tree (MST) of an Undirected Graph using Kruskal Algorithm - O(E.log(E)) or O(E.log(V))
Type of Algorithm | Subjects of Application | Time Complexity |
---|---|---|
Breadth-First Search | Unweighted, Un-/Directed Graph | O(V+E) for Adjacency List |
Dijkstra | Non-Negative Un-/Weighted Un-/Directed Graph | O(E.log(V)) for Min-priority Queue |
Bellman-Ford | ||
Floyd-Warshall |
-
- Shortest Path: Breadth-First Search: Find the Shortest Path in a Unweighted Un-/Directed Graph based on BFS - O(V+E) for Adjacency List , V, E is the number of vertices and edges
-
- Shortest Path: Dijkstra using Min-Heap[PDF]: Find Shortest Path of an Non-Negative Un-/Weighted Un-/Directed Graph based on Dijkstra Algorithm using Min-Heap - O(E.log(V))
-
- Shortest Path: Bellman-Ford (Đang cập nhật)
-
- Shortest Path: Floyd-Warshall (Đang cập nhật)
- Find the "Decent Number" having n Digits ("Decent Number" has its digits to be only 3's and/or 5's; the number of 3's it contains is divisible by 5; the number of 5's it contains is divisible by 3; and it is the largest such number for its length)
- Swap 2 digits of a number k times to get largest number - O(n)
Coin Change Algorithms: Given an array of choices, every choice is picked unlimited times
Knapsack Problems: Given an array of choices, every choice is picked only once
-
- Coin Change[PDF]: How many ways to pay V money using C coins [C1,C2,...Cn] - O(C.V)
-
- Integer Partition[PDF]: How many ways to partition number N using [1,2,...N] numbers - O(n1.5)
-
- Minimum Coin Change[Wiki]: Find Minimum Number of Coins to pay V money using C coins [C1,C2,...,Cn] - O(C.V)
-
- Knapsack 0/1[Wiki]: Given a List of Weights associated with their Values, find the Founding Weights and Maximum Total Value attained with its Total Weight <= Given Total Weight, each Weight is only picked once (0/1 Rule) - O(N.W) , N, W is length of weights array and given total weight
-
- Partition Problem: Subset Sum[Wiki]: Given an Array containing only Positive Integers, find if it can be Partitioned into 2 Subsets having Sum of elements in both subsets is Equal. - O(N.T) , N, T is the length of numbers array and the target sum (=sum/2)
-
- Partition Problem: Multiway Number Partitioning[Wiki]: Đang cập nhật
-
- Max Path Sum Triangle[PDF]: Find Maximum Path Sum from Top to Bottom of a Triangle - O(R) , R is number of rows of the triangle
-
- Min Path Sum Matrix: Top-Left to Right-Bottom, Right and Down Moves[PDF]: Find Min Path Sum from Top-Left to Right-Bottom of a Matrix using Right and Down Moves - O(R.C) , R, C is length of row and column of the matrix
Subsequence = Any subset of an array/string
Subarray = Contiguous subsequence of an array
Substring = Contiguous subsequence of a string
-
- Max Subarray Sum (Kadane Algorithm)[PDF]: Find Maximum Subarray Sum of an Array - O(n)
-
- Max Subarray Sum (Kadane Algorithm - Extended)[PDF]: Find Maximum Subarray Sum of an Array and its Indices - O(n)
-
- Min Subarray Sum (Kadane Algorithm's Min Varient): Find Minimum Subarray Sum of an Array - O(n)
-
- Subarray Sum Equals K[Leetcode]: Find the Number of Continuous Subarrays of an Array whose Sum Equals to K - O(n)
-
- Subarray Sum Divisible by K[Leetcode]: Find the Number of Continuous Subarrays of an Array whose Sum is Divisible by K - O(n)
-
- Longest Common Subsequence (LCS)[PDF]: Find the longest string S, every character in S is also in S1 and S2 but in order - O(|S1|.|S2|)
-
- Longest Increasing/Decreasing Subsequence (Patience Sorting Algorithm)[PDF]: Find the Longest Increasing or Decreasing Subsequence of an Array List based on Patience Sorting Algorithm- O(n.log(n))
-
- Longest Common Substring (Longest Common Factor - LCF): Find the Longest Common Substring (Factor) of 2 strings S1 and S2 - O(|S1|.|S2|)
-
- Sum Of Substrings[PDF]: Find Sum of All Substrings of an Number String S - O(|S|)
-
- Pascal Triangle: Create Pascal Triangle (to Calculate Multiple Large-Number Combinations) - O(n2)
-
- PE #15: Lattice Paths[PDF] : Find the number of routes from the top left corner to the bottom right corner in a rectangular grid
-
- Factorization: Find All Factors of a Number - O(n1/2)
-
- PE #1: Multiples of 3 and 5[PDF]: Find Sum of Multiples of a Number - O(1)
-
- Lexicographic Permutations[PDF]: Find n-th Lexicographic Permutation of a very long Word - O(n)
-
- Permutation Check: Check if 2 Numbers/Strings are Permutations - O(n) , n = max(|a|,|b|)
-
- "Sieve Method" All Primes: Find All Primes < n - O(n1/2)
-
- Primality Test (Common Method): Check if n is a Prime Number using "Common Method" - O(n1/2)
-
- Primality Test (Miller-Rabin): Check if n is a Prime Number using Miller-Rabin Probabilistic Test - O(k.log3n) , k = [1,2,...]
-
- Coprimes Check: Check if 2 Numbers are Coprime - O(log a.b)
-
- Euler Totient Function (Number List): Find ALL Numbers of Coprimes < n based on Euler Totient Function - O((l) + m.loglogm + l.(logm + k)) , k is the number of prime factors of n; m and l is max value and length of the input number list
-
- Euler Totient Function (Single Number): Find the Number of Coprimes < n based on Euler Totient Function - O(n1/2 + k) , k is the number of prime factors of the input number n
-
- "Sieve Method" Smallest Prime Factors (SPF): Find Smallest Prime Factors for All Numbers < N - O(n.loglogn)
-
- Prime Factorization (Smallest Prime Factor): Find All Prime Factors of a Number using Smallest Prime Factor (SPF) - O(log n) if a list of all Smallest Prime Factors from 0 to n available
-
- Prime Factorization: Find All Prime Factors of a Number - O(n1/2)
-
- Pythagorean Triplets Perimeter: Find Pythagorean Triplets having Perimeter (or Sum) P - O(P)
-
- Pythagorean Triplets Less or Equal N: Generate all Pythagorean Triplets <= N - O(N.log(N))
-
- Number Spiral Diagonals[PDF]: Find Sum of Diagonals of Ulam Spiral Matrix