• Stars
    star
    184
  • Rank 209,187 (Top 5 %)
  • Language
    Jupyter Notebook
  • Created about 4 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Must-know competitive programming problems with solutions and intuitive visualizations

Awesome Competitive Programming Problems

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 :trollface: :trollface:

โš ๏ธ This repo is day-by-day updated. Please make sure you have the latest version!

๐Ÿ”ฅ New updates today: Longest Substring Without Repeating Characters[Leetcode]

โ“ How to use

Overview of the file:

๐Ÿงจ Tips and Tricks

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

๐Ÿ‰ Algorithms

A) Data Structures Applications

๐ŸŒด Binary Search Tree Algorithm

B) String Algorithm

๐ŸŒพ Suffix Tree - Suffix Array

    • Longest Palindromic Substring - O(n)
    • Pattern Search - O(log(n))

C) Searching and Graph Algorithms

โ„๏ธ Graph Theory

    • 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

โ™ป๏ธ Detect Cycle

    • 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)

โœˆ๏ธ Graph Traversal

    • 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

โ˜˜๏ธ Minimum Spanning Tree (MST)

    • 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))

๐Ÿ›ด Shortest Path

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: Bellman-Ford
    • Shortest Path: Floyd-Warshall

D) Greedy Algorithm

  1. Sherlock and The Beast
  • 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)
  1. Largest Permutation
  • Swap 2 digits of a number k times to get largest number - O(n)

E) Dynamic Programming

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 Algorithms

    • Coin Change[PDF]: How many ways to pay V money using C coins [C1,C2,...Cn] - O(C.V)

๐Ÿ‘œ Knapsack Problems

    • 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]:

๐Ÿ“ˆ Path Sum Problems

Subsequence = Any subset of an array/string

Subarray = Contiguous subsequence of an array

Substring = Contiguous subsequence of a string

๐Ÿ“… Subarray Problems

๐Ÿก Subsequence Problems

๐Ÿ“ƒ Substring Problems

F) Two Pointers - Sliding Window

๐Ÿ“– Non-categorized

G) Mathematics

๐Ÿ“˜ Binomial Coefficient Problems

    • 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

๐Ÿ“• Factors Problems

๐Ÿ“— Multiples Problems

๐Ÿ““ Permutation Problems

    • Permutation Check: Check if 2 Numbers/Strings are Permutations - O(n) , n = max(|a|,|b|)

๐Ÿ“™ Primes Problems

๐Ÿ“” Primes-Factors Problems

    • 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

๐Ÿ“’ Pythagorean Theorem

๐Ÿ“– Non-categorized

Recursion Algorithm

Backtracking

Divide and Conquer