A structured course outline, reference material, and challenge set covering the core concepts of Data Structures and Algorithms. Challenges can be solved in any programming language of your choice. Solutions are provided for reference.
This repository serves as a complete, self-contained DSA learning resource. Whether you are an absolute beginner building your foundation, a student working through coursework, a self-taught developer filling in gaps, or a software engineer preparing for technical interviews — this repository is structured to meet you where you are and take you further.
It is not a static document. It grows as new content, challenges, and solutions are added over time.
The repository covers the following topics, progressing from foundational concepts to advanced techniques:
- Big O Notation — time and space complexity analysis
- Arrays
- Linked Lists
- Stacks
- Queues
- Hash Maps
- Trees and Binary Search Trees
- Heaps and Priority Queues
- Tries
- Recursion and Memoization
- Binary Search
- Sorting — Merge Sort, Quick Sort
- Two Pointers
- Sliding Window
- Graph Traversal — BFS and DFS
- Dynamic Programming
.
├── README.md — you are here
├── notes/dsa_summary.md — complete concept reference and revision sheet
├── problems/dsa_challenges.md — 60+ practice problems organized by topic
└── solutions/ — solutions to challenges (added progressively)
If you are a beginner, start with dsa_summary.md. Read through each topic in order. The concepts build on one another — Big O first, then Arrays and Linked Lists, then the more complex structures.
If you are preparing for interviews, go directly to dsa_challenges.md. Problems are labelled by difficulty and topic. Work through them under timed conditions — 20 to 45 minutes per problem — and check solutions only after a genuine attempt.
If you are revisiting a specific topic, use dsa_summary.md as a quick reference. Each section includes key concepts, Big O tables, and notes on when to apply each structure or technique.
All challenges in this repository are language agnostic. You may solve them in any programming language you are comfortable with. Common choices include:
- Python
- C
- Java
- JavaScript
- C++
The concepts, patterns, and complexities are identical regardless of language. Pick the one you know best and focus on the thinking, not the syntax.
Solutions to all challenges exist and are provided for reference. They are intended to be consulted after a genuine attempt — not before. Reading a solution without attempting the problem first will undermine the learning process.
Solutions include explanation of the approach, time complexity, space complexity, and notes on edge cases where relevant.
This repository is primarily a personal learning resource but contributions are welcome. If you spot an error, have a cleaner solution, or want to add a challenge, feel free to open a pull request.
Understanding a concept and being able to implement it under pressure are two different skills. Reading this material is the first step. Solving problems consistently, testing edge cases rigorously, and analysing your own solutions for efficiency is what builds genuine competence.
Consistent practice on these patterns is what gets people through technical interviews and makes them better engineers in practice.
This repository is actively maintained and updated as new content is added.