Curated list of computer science problems and how to solve them using algorithmic design techniques
On this webpage, we provide a curated list of computer science problems partitioned into several algorithm design approaches (techniques) such as divide & conquer, greedy approach, dynamic programming, and backtracking.
We present each computer science problem on an interactive jupyter notebook page. Jupyter Notebook pages are hosted at Google Colab and include the following sections:
Description of the computer science problem with sample inputs and output.
Visualization of the problem
Brute force solution and its time complexity analysis
Steps for solving the problem using a design approach (technique)
Pseudocode of the solution using the algorithmic design approach
Executable Python code implementation for the design approach
Asymptotic (Time and Space) Complexity Analysis of the Solution
Application areas of the computer science problem
References
A template of a Jupyter Notebook page that includes the sections listed above can be downloaded here.
We present interactive examples of algorithm design approaches in the following four main categories: Divide & Conquer, Greedy Approach, Dynamic Programming, and Backtracking. The following web pages include the description of the design technique, steps involved in applying the technique, and a list of jupyter notebooks that each presents how to solve a computer science problem using the technique.
List of Interactive Examples Applying the Divide & Conquer Technique
List of Interactive Examples Applying the Greedy Approach
List of Interactive Examples Applying the Dynamic Programming
List of Interactive Examples Applying the Backtracking
If you need a refresher about time complexity analysis, please visit this page to read the description and examples of the concepts.
A list of well-known computer science problems categorized under algorithm design techniques and their brief description can be found here.