Welcome to just-dsa
containing a collection of data structure and algorithm problems. This repository is organized into different directories, each focusing on a specific category of problems. Here's a brief overview of what you'll find:
- arrays-and-strings: Problems related to arrays and strings.
- binary-search: Problems that involve binary search algorithms.
- concurrency: Problems related to concurrent programming.
- graph: Problems involving graphs and graph algorithms.
- intervals: Problems dealing with intervals and ranges.
- math: Problems related to mathematical algorithms and concepts.
- queue: Problems involving queues.
- sliding-window: Problems that can be solved using the sliding window technique.
- stack: Problems involving stacks.
- two-pointers: Problems that can be solved using the two pointers technique.
- back-tracking: Problems that can be solved using backtracking algorithms.
- bit-ops: Problems related to bitwise operations.
- dynamic-programming: Problems that can be solved using dynamic programming techniques.
- greedy: Problems that can be solved using greedy algorithms.
- linked-list: Problems involving linked lists.
- prefix-sums: Problems that can be solved using prefix sums.
- sort: Problems related to sorting algorithms.
- time-series: Problems related to time series data.
-
Arrays and Strings: Fundamental data structures used to store and manipulate collections of elements and sequences of characters, respectively.
-
Binary Search: An efficient search algorithm used to find the position of a target value within a sorted array.
-
Concurrency: The ability of a system to handle multiple tasks simultaneously, often achieved through techniques such as multithreading and multiprocessing.
-
Graphs: Abstract data structures consisting of nodes (vertices) and edges that connect them, used to represent relationships between objects.
-
Intervals: Representations of continuous ranges of values or time periods.
-
Math: Various mathematical algorithms and concepts, including arithmetic operations, number theory, geometry, and more.
-
Queue: A data structure that follows the First-In-First-Out (FIFO) principle, where elements are added to the back and removed from the front.
-
Sliding Window: A technique used to solve problems involving arrays or strings by maintaining a subset of elements within a fixed window size.
-
Stack: A data structure that follows the Last-In-First-Out (LIFO) principle, where elements are added and removed from the same end.
-
Two Pointers: A technique used to solve problems by iterating through an array or list using two pointers, often to find a certain pattern or sum.
-
Backtracking: A recursive algorithmic technique that involves systematically exploring all possible solutions to a problem by making choices at each step.
-
Bitwise Operations: Operations performed on individual bits of binary numbers, commonly used in low-level programming and optimization.
-
Dynamic Programming: A technique used to solve problems by breaking them down into simpler subproblems and solving each subproblem only once, storing the solutions to avoid redundant computations.
-
Greedy Algorithms: Algorithms that make locally optimal choices at each step with the hope of finding a global optimum solution.
-
Linked List: A linear data structure consisting of a sequence of elements where each element points to the next one in the sequence.
-
Prefix Sums: A technique used to efficiently calculate cumulative sums of elements in an array.
-
Sort: Algorithms used to arrange elements of a list or array in a particular order, such as numerical or lexicographical order.
-
Time Series: Data organized in chronological order, often used in statistics, finance, and other fields to analyze trends over time.
Each directory contains its own README.md file with a list of problems specific to that category. Feel free to explore, solve, and contribute to this repository!
Contributions are welcome! If you have a new problem to add or have found a bug in an existing one, please follow these steps:
- Fork this repository.
- Create a new branch for your changes.
- Make your modifications.
- Test your changes if applicable.
- Submit a pull request with a descriptive title and detailed explanation of your changes.
Thank you for contributing to this repository and happy problem-solving.