Please press β button if you like this repo. ThαΊ₯y ngon thΓ¬ nhαΊ₯n star β ủng hα» mΓ¬nh nha cΓ‘c Δα»ng rΓ’m
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
π₯ New updates today: Longest Substring Without Repeating Characters[Leetcode]
Overview of the file:
Here is some tips and tricks to ACE all competitive programming problems and interview questions:
If input array is sorted then
- Binary search
- Two pointers
If asked for all permutations/subsets then
- Backtracking
If given a tree then
- DFS
- BFS
If given a graph then
- DFS
- BFS
If given a linked list then
- Two pointers
If recursion is banned then
- Stack
If must solve in-place then
- Swap corresponding values
- Store one or more different values in the same pointer
If asked for maximum/minumum subarray/subset/options then
- Dynamic programming
If asked for top/least K items then
- Heap
If asked for common strings then
- Map
- Trie
Else
- Map/Set for O(1) time & O(n) space
- Sort input for O(nlogn) time and O(1) space
-
- 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)
-
- Pattern Search - O(log(n))
-
- 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
-
- 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
-
- 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
-
- Shortest Path: Floyd-Warshall
- 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]:
-
- 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|)
-
- Longest Substring Without Repeating Characters[Leetcode]: Find the Length of the Longest Substring Without Repeating Characters - 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 - Space = 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
Problem statement: Do something on a given singly-linked List
Hints:
- Simply convert linked list to 1D array and solve on the array using "ListNode_to_Array"
- If necessary, convert 1D array back to the linked list using "Array_to_ListNode"
-
- List Node: Create a Singly-linked List using "Node class"
-
- ListNode to Array: Convert ListNode into Array, could be used as print to "see" inside a ListNode - O(n)
-
- Array to ListNode: Convert Array into ListNode - O(n)
Problem statement: Move current position within the matrix along diagonals, up-down-right-left, ...
Hints:
- Use variable flag = 'up' or 'down' ... to guide the current position to the next position
if flag == 'up': # Do something # Consider to change the flag = 'down' or 'right' or 'something'
- Pay attention to the matrix boundary when moving
def inMatrix(r,c): # R, C is the matrix size # r, c is current position if r >= 0 and c >= 0 and r < R and c < C: return True else: return False
- Use variable seen = set() to not move to the seen position or to not start as a current position
if (r,c) not in seen: # Do something
-
- Spiral Matrix[Leetcode]: Find all elements of the matrix in spiral order - O(R.C)
-
- Diagonal_Traverse[Leetcode]: Find all the elements of the array in a diagonal order - O(R.C)