Awesome-Competitive-Programming icon indicating copy to clipboard operation
Awesome-Competitive-Programming copied to clipboard

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 dâ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:

:warning: This repo is day-by-day updated. Please make sure you have the latest version!

:fire: New updates today: Longest Substring Without Repeating Characters[Leetcode]

:question: How to use

Overview of the file:

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

:watermelon: Algorithms

A) Data Structures Applications

:palm_tree: Binary Search Tree Algorithm

B) String Algorithm

:ear_of_rice: Suffix Tree - Suffix Array

    • [ ] Longest Palindromic Substring - O(n) <Đợi xíu đang (lười) cập nhật :woozy_face:>
    • [ ] Pattern Search - O(log(n)) <Đợi xíu bug nhiều vl sửa mãi chưa xong :dizzy_face:>

C) Searching and Graph Algorithms

:snowflake: Graph Theory

    • [ ] Graph Representation using Adjacency List: Weighted, Un-/Directed <Mốt rảnh sẽ cập nhật sau :weary:>
    • [x] 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 <Cái này dễ mà lười code ~@@~>

:recycle: Detect Cycle

    • [x] 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)

:airplane: Graph Traversal

    • [x] 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
    • [x] 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

:shamrock: Minimum Spanning Tree (MST)

    • [x] MST: Prim Algorithm[PDF]: Find Minimum Spanning Tree (MST) of an Undirected Graph using Prim Algorithm - O(E.log(V))
    • [x] 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))

:kick_scooter: 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
    • [x] 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 <Khó như chó méo bít code sao lun á mấy ba :joy:>
    • [ ] Shortest Path: Floyd-Warshall <Cùng lý do như trên :grin:>

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

:moneybag: Coin Change Algorithms

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

:handbag: Knapsack Problems

    • [x] 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
    • [x] 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]: <Câu này để thi Olympic thôi chứ công ty nào hỏi phỏng vấn thì tán xéo háng nó :smiling_imp:>

:chart_with_upwards_trend: Path Sum Problems

    • [x] 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

Subsequence = Any subset of an array/string

Subarray = Contiguous subsequence of an array

Substring = Contiguous subsequence of a string

:date: Subarray Problems

:dango: Subsequence Problems

:page_with_curl: Substring Problems

F) Two Pointers - Sliding Window

:book: Non-categorized

G) Mathematics

:blue_book: Binomial Coefficient Problems

    • [x] Pascal Triangle: Create Pascal Triangle (to Calculate Multiple Large-Number Combinations) - O(n2)
    • [x] PE #15: Lattice Paths[PDF] : Find the number of routes from the top left corner to the bottom right corner in a rectangular grid

:closed_book: Factors Problems

:green_book: Multiples Problems

:notebook: Permutation Problems

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

:orange_book: Primes Problems

:notebook_with_decorative_cover: Primes-Factors Problems

    • [x] 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

:ledger: Pythagorean Theorem

:book: Non-categorized

Recursion Algorithm

<Mới bị cắm sừng, méo mún code nữa :bomb:>

Backtracking

Divide and Conquer