├── .eslintrc.cjs
├── .gitignore
├── LICENSE
├── README.md
├── docs
├── assets
│ ├── bg-city-night-Hn7IgFgp.webp
│ ├── bg-cotton-orb-COQ-b5QR.webp
│ ├── firacode-DmifnrmV.woff2
│ ├── index-CCPfFMQM.js
│ ├── index-DqUlzqnG.css
│ └── silkscreen-DLtPLOcD.woff2
├── favicon
│ ├── android-chrome-192x192.png
│ ├── android-chrome-512x512.png
│ ├── apple-touch-icon.png
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── favicon.ico
│ └── site.webmanifest
├── index.html
└── robots.txt
├── index.html
├── package-lock.json
├── package.json
├── public
├── favicon
│ ├── android-chrome-192x192.png
│ ├── android-chrome-512x512.png
│ ├── apple-touch-icon.png
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── favicon.ico
│ └── site.webmanifest
└── robots.txt
├── src
├── code
│ ├── cpp
│ │ ├── array
│ │ │ ├── prefix_sum.cpp
│ │ │ ├── sliding_window.cpp
│ │ │ ├── string_building.cpp
│ │ │ ├── two_pointers_one_input.cpp
│ │ │ └── two_pointers_two_inputs.cpp
│ │ ├── backtracking
│ │ │ └── backtracking.cpp
│ │ ├── binary_search
│ │ │ ├── binary_search.cpp
│ │ │ ├── duplicate_elements_left_insertion.cpp
│ │ │ ├── duplicate_elements_right_insertion.cpp
│ │ │ ├── greedy_maximum.cpp
│ │ │ └── greedy_minimum.cpp
│ │ ├── binary_tree
│ │ │ ├── bfs.cpp
│ │ │ ├── dfs_iterative.cpp
│ │ │ └── dfs_recursive.cpp
│ │ ├── bit_manipulation
│ │ │ ├── check_power_of_two.cpp
│ │ │ ├── clear_kth_bit.cpp
│ │ │ ├── count_set_bits.cpp
│ │ │ ├── divide_power_of_two.cpp
│ │ │ ├── get_rightmost_bit.cpp
│ │ │ ├── multiply_power_of_two.cpp
│ │ │ ├── set_kth_bit.cpp
│ │ │ ├── swap_variables.cpp
│ │ │ ├── test_kth_bit.cpp
│ │ │ └── toggle_kth_bit.cpp
│ │ ├── data_structures
│ │ │ ├── array.cpp
│ │ │ ├── binary_search_tree.cpp
│ │ │ ├── binary_tree.cpp
│ │ │ ├── doubly_linked_list.cpp
│ │ │ ├── graph.cpp
│ │ │ ├── hash_map.cpp
│ │ │ ├── linked_list.cpp
│ │ │ ├── trie.cpp
│ │ │ ├── union_find.cpp
│ │ │ └── union_find_optimized.cpp
│ │ ├── dynamic_programming
│ │ │ ├── bottom_up.cpp
│ │ │ ├── kadane.cpp
│ │ │ └── top_down.cpp
│ │ ├── graph
│ │ │ ├── bellman_ford.cpp
│ │ │ ├── bfs.cpp
│ │ │ ├── dfs_iterative.cpp
│ │ │ ├── dfs_recursive.cpp
│ │ │ ├── dijkstra.cpp
│ │ │ ├── kahn.cpp
│ │ │ ├── kruskal.cpp
│ │ │ └── prim.cpp
│ │ ├── hash_map
│ │ │ ├── find_number_of_subarrays.cpp
│ │ │ └── sliding_window.cpp
│ │ ├── heap
│ │ │ └── find_top_k_elements.cpp
│ │ ├── linked_list
│ │ │ ├── fast_and_slow_pointer.cpp
│ │ │ └── reverse_linked_list.cpp
│ │ ├── matrix
│ │ │ ├── create_copy.cpp
│ │ │ ├── diagonals.cpp
│ │ │ └── rotate_transpose.cpp
│ │ ├── sorting_algorithms
│ │ │ ├── bogo_sort.cpp
│ │ │ ├── bubble_sort.cpp
│ │ │ ├── bucket_sort.cpp
│ │ │ ├── counting_sort.cpp
│ │ │ ├── cube_sort.cpp
│ │ │ ├── heap_sort.cpp
│ │ │ ├── insertion_sort.cpp
│ │ │ ├── merge_sort.cpp
│ │ │ ├── pancake_sort.cpp
│ │ │ ├── quick_sort.cpp
│ │ │ ├── radix_sort.cpp
│ │ │ ├── selection_sort.cpp
│ │ │ ├── shell_sort.cpp
│ │ │ ├── sleep_sort.cpp
│ │ │ └── tim_sort.cpp
│ │ └── stack
│ │ │ ├── monotonic_decreasing.cpp
│ │ │ └── monotonic_increasing.cpp
│ ├── java
│ │ ├── array
│ │ │ ├── prefix_sum.java
│ │ │ ├── sliding_window.java
│ │ │ ├── string_building.java
│ │ │ ├── two_pointers_one_input.java
│ │ │ └── two_pointers_two_inputs.java
│ │ ├── backtracking
│ │ │ └── backtracking.java
│ │ ├── binary_search
│ │ │ ├── binary_search.java
│ │ │ ├── duplicate_elements_left_insertion.java
│ │ │ ├── duplicate_elements_right_insertion.java
│ │ │ ├── greedy_maximum.java
│ │ │ └── greedy_minimum.java
│ │ ├── binary_tree
│ │ │ ├── bfs.java
│ │ │ ├── dfs_iterative.java
│ │ │ └── dfs_recursive.java
│ │ ├── bit_manipulation
│ │ │ ├── check_power_of_two.java
│ │ │ ├── clear_kth_bit.java
│ │ │ ├── count_set_bits.java
│ │ │ ├── divide_power_of_two.java
│ │ │ ├── get_rightmost_bit.java
│ │ │ ├── multiply_power_of_two.java
│ │ │ ├── set_kth_bit.java
│ │ │ ├── swap_variables.java
│ │ │ ├── test_kth_bit.java
│ │ │ └── toggle_kth_bit.java
│ │ ├── data_structures
│ │ │ ├── array.java
│ │ │ ├── binary_search_tree.java
│ │ │ ├── binary_tree.java
│ │ │ ├── doubly_linked_list.java
│ │ │ ├── graph.java
│ │ │ ├── hash_map.java
│ │ │ ├── linked_list.java
│ │ │ ├── trie.java
│ │ │ ├── union_find.java
│ │ │ └── union_find_optimized.java
│ │ ├── dynamic_programming
│ │ │ ├── bottom_up.java
│ │ │ ├── kadane.java
│ │ │ └── top_down.java
│ │ ├── graph
│ │ │ ├── bellman_ford.java
│ │ │ ├── bfs.java
│ │ │ ├── dfs_iterative.java
│ │ │ ├── dfs_recursive.java
│ │ │ ├── dijkstra.java
│ │ │ ├── kahn.java
│ │ │ ├── kruskal.java
│ │ │ └── prim.java
│ │ ├── hash_map
│ │ │ ├── find_number_of_subarrays.java
│ │ │ └── sliding_window.java
│ │ ├── heap
│ │ │ └── find_top_k_elements.java
│ │ ├── linked_list
│ │ │ ├── fast_and_slow_pointer.java
│ │ │ └── reverse_linked_list.java
│ │ ├── matrix
│ │ │ ├── create_copy.java
│ │ │ ├── diagonals.java
│ │ │ └── rotate_transpose.java
│ │ ├── sorting_algorithms
│ │ │ ├── bogo_sort.java
│ │ │ ├── bubble_sort.java
│ │ │ ├── bucket_sort.java
│ │ │ ├── counting_sort.java
│ │ │ ├── cube_sort.java
│ │ │ ├── heap_sort.java
│ │ │ ├── insertion_sort.java
│ │ │ ├── merge_sort.java
│ │ │ ├── pancake_sort.java
│ │ │ ├── quick_sort.java
│ │ │ ├── radix_sort.java
│ │ │ ├── selection_sort.java
│ │ │ ├── shell_sort.java
│ │ │ ├── sleep_sort.java
│ │ │ └── tim_sort.java
│ │ └── stack
│ │ │ ├── monotonic_decreasing.java
│ │ │ └── monotonic_increasing.java
│ ├── javascript
│ │ ├── array
│ │ │ ├── prefix_sum.js
│ │ │ ├── sliding_window.js
│ │ │ ├── string_building.js
│ │ │ ├── two_pointers_one_input.js
│ │ │ └── two_pointers_two_inputs.js
│ │ ├── backtracking
│ │ │ └── backtracking.js
│ │ ├── binary_search
│ │ │ ├── binary_search.js
│ │ │ ├── duplicate_elements_left_insertion.js
│ │ │ ├── duplicate_elements_right_insertion.js
│ │ │ ├── greedy_maximum.js
│ │ │ └── greedy_minimum.js
│ │ ├── binary_tree
│ │ │ ├── bfs.js
│ │ │ ├── dfs_iterative.js
│ │ │ └── dfs_recursive.js
│ │ ├── bit_manipulation
│ │ │ ├── check_power_of_two.js
│ │ │ ├── clear_kth_bit.js
│ │ │ ├── count_set_bits.js
│ │ │ ├── divide_power_of_two.js
│ │ │ ├── get_rightmost_bit.js
│ │ │ ├── multiply_power_of_two.js
│ │ │ ├── set_kth_bit.js
│ │ │ ├── swap_variables.js
│ │ │ ├── test_kth_bit.js
│ │ │ └── toggle_kth_bit.js
│ │ ├── data_structures
│ │ │ ├── array.js
│ │ │ ├── binary_search_tree.js
│ │ │ ├── binary_tree.js
│ │ │ ├── doubly_linked_list.js
│ │ │ ├── graph.js
│ │ │ ├── hash_map.js
│ │ │ ├── linked_list.js
│ │ │ ├── trie.js
│ │ │ ├── union_find.js
│ │ │ └── union_find_optimized.js
│ │ ├── dynamic_programming
│ │ │ ├── bottom_up.js
│ │ │ ├── kadane.js
│ │ │ └── top_down.js
│ │ ├── graph
│ │ │ ├── bellman_ford.js
│ │ │ ├── bfs.js
│ │ │ ├── dfs_iterative.js
│ │ │ ├── dfs_recursive.js
│ │ │ ├── dijkstra.js
│ │ │ ├── kahn.js
│ │ │ ├── kruskal.js
│ │ │ └── prim.js
│ │ ├── hash_map
│ │ │ ├── find_number_of_subarrays.js
│ │ │ └── sliding_window.js
│ │ ├── heap
│ │ │ └── find_top_k_elements.js
│ │ ├── linked_list
│ │ │ ├── fast_and_slow_pointer.js
│ │ │ └── reverse_linked_list.js
│ │ ├── matrix
│ │ │ ├── create_copy.js
│ │ │ ├── diagonals.js
│ │ │ └── rotate_transpose.js
│ │ ├── sorting_algorithms
│ │ │ ├── bogo_sort.js
│ │ │ ├── bubble_sort.js
│ │ │ ├── bucket_sort.js
│ │ │ ├── counting_sort.js
│ │ │ ├── cube_sort.js
│ │ │ ├── heap_sort.js
│ │ │ ├── insertion_sort.js
│ │ │ ├── merge_sort.js
│ │ │ ├── pancake_sort.js
│ │ │ ├── quick_sort.js
│ │ │ ├── radix_sort.js
│ │ │ ├── selection_sort.js
│ │ │ ├── shell_sort.js
│ │ │ ├── sleep_sort.js
│ │ │ └── tim_sort.js
│ │ └── stack
│ │ │ ├── monotonic_decreasing.js
│ │ │ └── monotonic_increasing.js
│ └── python
│ │ ├── array
│ │ ├── prefix_sum.py
│ │ ├── sliding_window.py
│ │ ├── string_building.py
│ │ ├── two_pointers_one_input.py
│ │ └── two_pointers_two_inputs.py
│ │ ├── backtracking
│ │ └── backtracking.py
│ │ ├── binary_search
│ │ ├── binary_search.py
│ │ ├── duplicate_elements_left_insertion.py
│ │ ├── duplicate_elements_right_insertion.py
│ │ ├── greedy_maximum.py
│ │ └── greedy_minimum.py
│ │ ├── binary_tree
│ │ ├── bfs.py
│ │ ├── dfs_iterative.py
│ │ └── dfs_recursive.py
│ │ ├── bit_manipulation
│ │ ├── check_power_of_two.py
│ │ ├── clear_kth_bit.py
│ │ ├── count_set_bits.py
│ │ ├── divide_power_of_two.py
│ │ ├── get_rightmost_bit.py
│ │ ├── multiply_power_of_two.py
│ │ ├── set_kth_bit.py
│ │ ├── swap_variables.py
│ │ ├── test_kth_bit.py
│ │ └── toggle_kth_bit.py
│ │ ├── data_structures
│ │ ├── array.py
│ │ ├── binary_search_tree.py
│ │ ├── binary_tree.py
│ │ ├── doubly_linked_list.py
│ │ ├── graph.py
│ │ ├── hash_map.py
│ │ ├── linked_list.py
│ │ ├── trie.py
│ │ ├── union_find.py
│ │ └── union_find_optimized.py
│ │ ├── dynamic_programming
│ │ ├── bottom_up.py
│ │ ├── kadane.py
│ │ └── top_down.py
│ │ ├── graph
│ │ ├── bellman_ford.py
│ │ ├── bfs.py
│ │ ├── dfs_iterative.py
│ │ ├── dfs_recursive.py
│ │ ├── dijkstra.py
│ │ ├── kahn.py
│ │ ├── kruskal.py
│ │ └── prim.py
│ │ ├── hash_map
│ │ ├── find_number_of_subarrays.py
│ │ └── sliding_window.py
│ │ ├── heap
│ │ └── find_top_k_elements.py
│ │ ├── linked_list
│ │ ├── fast_and_slow_pointer.py
│ │ └── reverse_linked_list.py
│ │ ├── matrix
│ │ ├── create_copy.py
│ │ ├── diagonals.py
│ │ └── rotate_transpose.py
│ │ ├── sorting_algorithms
│ │ ├── bogo_sort.py
│ │ ├── bubble_sort.py
│ │ ├── bucket_sort.py
│ │ ├── counting_sort.py
│ │ ├── cube_sort.py
│ │ ├── heap_sort.py
│ │ ├── insertion_sort.py
│ │ ├── merge_sort.py
│ │ ├── pancake_sort.py
│ │ ├── quick_sort.py
│ │ ├── radix_sort.py
│ │ ├── selection_sort.py
│ │ ├── shell_sort.py
│ │ ├── sleep_sort.py
│ │ └── tim_sort.py
│ │ └── stack
│ │ ├── monotonic_decreasing.py
│ │ └── monotonic_increasing.py
├── components
│ ├── Accordion
│ │ ├── accordion.module.sass
│ │ └── index.tsx
│ ├── App
│ │ └── index.tsx
│ ├── Appbar
│ │ └── index.tsx
│ ├── Background
│ │ ├── background.module.sass
│ │ └── index.tsx
│ ├── Brand
│ │ ├── brand.module.sass
│ │ └── index.tsx
│ ├── Code
│ │ ├── code.module.sass
│ │ ├── index.tsx
│ │ └── python.tsx
│ ├── Content
│ │ ├── content.module.sass
│ │ └── index.tsx
│ ├── CopyButton
│ │ ├── copybutton.module.sass
│ │ └── index.tsx
│ ├── Language
│ │ └── context.tsx
│ ├── LinkWithTooltip
│ │ ├── index.tsx
│ │ └── linkwithtooltip.module.sass
│ ├── Sidebar
│ │ ├── SidebarLinks.tsx
│ │ ├── context.tsx
│ │ ├── index.tsx
│ │ └── sidebar.module.sass
│ ├── Tabs
│ │ ├── index.tsx
│ │ └── tabs.module.sass
│ ├── ThemeSwitch
│ │ ├── index.tsx
│ │ └── themeswitch.module.sass
│ ├── Tooltip
│ │ ├── index.tsx
│ │ └── tooltip.module.sass
│ └── Topbar
│ │ ├── index.tsx
│ │ └── topbar.module.sass
├── fonts
│ ├── firacode.woff2
│ ├── neometric.woff2
│ └── silkscreen.woff2
├── hooks
│ ├── useClickOutside.tsx
│ ├── useScrollDistance.tsx
│ ├── useScrollTo.tsx
│ └── useTheme.tsx
├── icons
│ ├── Check.tsx
│ ├── Chevron.tsx
│ ├── Copy.tsx
│ ├── Cpp.tsx
│ ├── Download.tsx
│ ├── File.tsx
│ ├── Github.tsx
│ ├── GithubLight.tsx
│ ├── Java.tsx
│ ├── Javascript.tsx
│ └── Python.tsx
├── images
│ ├── banner.webp
│ ├── bg-city-day.webp
│ ├── bg-city-night-2.webp
│ ├── bg-city-night-3.webp
│ ├── bg-city-night.webp
│ └── bg-cotton-orb.webp
├── main.tsx
├── sections
│ ├── Array
│ │ └── index.tsx
│ ├── Backtracking
│ │ └── index.tsx
│ ├── BigO
│ │ ├── Chart.tsx
│ │ ├── DataStructureOperationsTable.tsx
│ │ ├── SortingAlgorithmsTable.tsx
│ │ ├── bigo.module.sass
│ │ └── index.tsx
│ ├── BinarySearch
│ │ └── index.tsx
│ ├── BinaryTree
│ │ └── index.tsx
│ ├── BitManipulation
│ │ └── index.tsx
│ ├── DataStructures
│ │ └── index.tsx
│ ├── DynamicProgramming
│ │ └── index.tsx
│ ├── Graph
│ │ └── index.tsx
│ ├── HashMap
│ │ └── index.tsx
│ ├── Heap
│ │ └── index.tsx
│ ├── LinkedList
│ │ └── index.tsx
│ ├── Matrix
│ │ └── index.tsx
│ ├── SortingAlgorithms
│ │ └── index.tsx
│ ├── Stack
│ │ └── index.tsx
│ └── section.module.sass
├── styles
│ ├── buttons.sass
│ ├── colors.sass
│ ├── document.sass
│ ├── hljstheme.sass
│ ├── styles.d.ts
│ ├── styles.sass
│ ├── table.sass
│ ├── themes.sass
│ └── typography.sass
└── utils
│ └── clsx.tsx
├── tsconfig.json
└── vite.config.ts
/.eslintrc.cjs:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | root: true,
3 | env: { browser: true, es2020: true },
4 | extends: [
5 | 'eslint:recommended',
6 | 'plugin:react/recommended',
7 | 'plugin:react/jsx-runtime',
8 | 'plugin:react-hooks/recommended',
9 | ],
10 | ignorePatterns: ['dist', '.eslintrc.cjs'],
11 | parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
12 | settings: { react: { version: '18.2' } },
13 | plugins: ['react-refresh'],
14 | rules: {
15 | 'react-refresh/only-export-components': [
16 | 'warn',
17 | { allowConstantExport: true },
18 | ],
19 | },
20 | }
21 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
26 | # Environment
27 | .env
28 | .env.local
29 | .env.development.local
30 | .env.test.local
31 | .env.production.local
32 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | - big o time/space complexities
6 | - code templates
7 | - data structure implementations
8 | - sorting algorithms
9 |
10 | ## License
11 | This project is released under the GNU GPL License - see the [LICENSE](LICENSE) file for details
12 |
--------------------------------------------------------------------------------
/docs/assets/bg-city-night-Hn7IgFgp.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/docs/assets/bg-city-night-Hn7IgFgp.webp
--------------------------------------------------------------------------------
/docs/assets/bg-cotton-orb-COQ-b5QR.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/docs/assets/bg-cotton-orb-COQ-b5QR.webp
--------------------------------------------------------------------------------
/docs/assets/firacode-DmifnrmV.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/docs/assets/firacode-DmifnrmV.woff2
--------------------------------------------------------------------------------
/docs/assets/silkscreen-DLtPLOcD.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/docs/assets/silkscreen-DLtPLOcD.woff2
--------------------------------------------------------------------------------
/docs/favicon/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/docs/favicon/android-chrome-192x192.png
--------------------------------------------------------------------------------
/docs/favicon/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/docs/favicon/android-chrome-512x512.png
--------------------------------------------------------------------------------
/docs/favicon/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/docs/favicon/apple-touch-icon.png
--------------------------------------------------------------------------------
/docs/favicon/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/docs/favicon/favicon-16x16.png
--------------------------------------------------------------------------------
/docs/favicon/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/docs/favicon/favicon-32x32.png
--------------------------------------------------------------------------------
/docs/favicon/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/docs/favicon/favicon.ico
--------------------------------------------------------------------------------
/docs/favicon/site.webmanifest:
--------------------------------------------------------------------------------
1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
--------------------------------------------------------------------------------
/docs/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "leetcode-cheatsheet",
3 | "private": true,
4 | "version": "1.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "vite build",
9 | "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
10 | "preview": "vite preview"
11 | },
12 | "dependencies": {
13 | "highlight.js": "^11.9.0",
14 | "react": "^18.2.0",
15 | "react-animate-height": "^3.2.3",
16 | "react-dom": "^18.2.0",
17 | "react-responsive": "^9.0.2"
18 | },
19 | "devDependencies": {
20 | "@types/node": "^20.11.17",
21 | "@types/react": "^18.2.55",
22 | "@types/react-dom": "^18.2.19",
23 | "@vitejs/plugin-react-swc": "^3.5.0",
24 | "eslint": "^8.55.0",
25 | "eslint-plugin-react": "^7.33.2",
26 | "eslint-plugin-react-hooks": "^4.6.0",
27 | "eslint-plugin-react-refresh": "^0.4.5",
28 | "sass": "^1.70.0",
29 | "typescript": "^5.3.3",
30 | "vite": "^5.0.8"
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/public/favicon/android-chrome-192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/public/favicon/android-chrome-192x192.png
--------------------------------------------------------------------------------
/public/favicon/android-chrome-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/public/favicon/android-chrome-512x512.png
--------------------------------------------------------------------------------
/public/favicon/apple-touch-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/public/favicon/apple-touch-icon.png
--------------------------------------------------------------------------------
/public/favicon/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/public/favicon/favicon-16x16.png
--------------------------------------------------------------------------------
/public/favicon/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/public/favicon/favicon-32x32.png
--------------------------------------------------------------------------------
/public/favicon/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/jwl-7/leetcode-cheatsheet/5393a421ca33005427cdfb85d674d431c5bfbf23/public/favicon/favicon.ico
--------------------------------------------------------------------------------
/public/favicon/site.webmanifest:
--------------------------------------------------------------------------------
1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
--------------------------------------------------------------------------------
/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/src/code/cpp/array/prefix_sum.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | using namespace std;
5 |
6 |
7 | vector fn(vector& arr) {
8 | int n = arr.size();
9 | vector prefix;
10 | prefix.push_back(arr[0]);
11 |
12 | for (int i = 1; i < n; ++i) {
13 | prefix.push_back(prefix.back() + arr[i]);
14 | }
15 |
16 | return prefix;
17 | }
18 |
--------------------------------------------------------------------------------
/src/code/cpp/array/sliding_window.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | int fn(vector& arr) {
7 | int n = arr.size();
8 | int window = 0;
9 | int left = 0;
10 | int ans = 0;
11 |
12 | for (int right = 0; right < n; right++) {
13 | // TODO: add arr[right] to window
14 |
15 | while (WINDOW_CONDITION_BROKEN) {
16 | // TODO: remove arr[left] from window
17 | left++;
18 | }
19 |
20 | // TODO: update ans
21 | }
22 |
23 | return ans;
24 | }
25 |
--------------------------------------------------------------------------------
/src/code/cpp/array/string_building.cpp:
--------------------------------------------------------------------------------
1 | string fn(vector& arr) {
2 | return string(arr.begin(), arr.end())
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/cpp/array/two_pointers_one_input.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | int fn(vector& arr) {
7 | int ans = 0;
8 | int left = 0;
9 | int right = arr.size() - 1;
10 |
11 | while (left < right) {
12 | // TODO: logic with left and right
13 | if (CONDITION) {
14 | left++;
15 | } else {
16 | right--;
17 | }
18 | }
19 |
20 | return ans;
21 | }
22 |
--------------------------------------------------------------------------------
/src/code/cpp/array/two_pointers_two_inputs.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | int fn(vector& arr1, vector& arr2) {
7 | int i = 0;
8 | int j = 0;
9 | int ans = 0;
10 |
11 | while (i < arr1.size() && j < arr2.size()) {
12 | // TODO: logic
13 | if (CONDITION) {
14 | i++;
15 | } else {
16 | j++;
17 | }
18 | }
19 |
20 | while (i < arr1.size()) {
21 | // TODO: logic
22 | i++;
23 | }
24 |
25 | while (j < arr2.size()) {
26 | // TODO: logic
27 | j++;
28 | }
29 |
30 | return ans;
31 | }
32 |
--------------------------------------------------------------------------------
/src/code/cpp/backtracking/backtracking.cpp:
--------------------------------------------------------------------------------
1 | int backtrack(STATE curr, OTHER_ARGUMENTS...) {
2 | if (BASE_CASE) {
3 | // TODO: modify answer
4 | return 0;
5 | }
6 |
7 | int ans = 0;
8 |
9 | for (ITERATE_OVER_INPUT) {
10 | // TODO: modify current state
11 | ans += backtrack(curr, OTHER_ARGUMENTS...);
12 | // TODO: undo modification of current state
13 | }
14 |
15 | return ans;
16 | }
17 |
--------------------------------------------------------------------------------
/src/code/cpp/binary_search/binary_search.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | int fn(vector& arr, int target) {
7 | int left = 0;
8 | int right = arr.size() - 1;
9 |
10 | while (left <= right) {
11 | int mid = left + (right - left) / 2;
12 |
13 | if (arr[mid] == target) {
14 | // TODO: logic
15 | return mid;
16 | }
17 | if (arr[mid] > target) {
18 | right = mid - 1;
19 | } else {
20 | left = mid + 1;
21 | }
22 | }
23 |
24 | return left;
25 | }
26 |
--------------------------------------------------------------------------------
/src/code/cpp/binary_search/duplicate_elements_left_insertion.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | int fn(vector& arr, int target) {
7 | int left = 0;
8 | int right = arr.size();
9 |
10 | while (left < right) {
11 | int mid = left + (right - left) / 2;
12 |
13 | if (arr[mid] >= target) {
14 | right = mid;
15 | } else {
16 | left = mid + 1;
17 | }
18 | }
19 |
20 | return left;
21 | }
22 |
--------------------------------------------------------------------------------
/src/code/cpp/binary_search/duplicate_elements_right_insertion.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | int fn(vector& arr, int target) {
7 | int left = 0;
8 | int right = arr.size();
9 |
10 | while (left < right) {
11 | int mid = left + (right - left) / 2;
12 |
13 | if (arr[mid] > target) {
14 | right = mid;
15 | } else {
16 | left = mid + 1;
17 | }
18 | }
19 |
20 | return left;
21 | }
22 |
--------------------------------------------------------------------------------
/src/code/cpp/binary_search/greedy_maximum.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | bool check(int x) {
7 | return BOOLEAN;
8 | }
9 |
10 | int fn(vector& arr) {
11 | int left = MINIMUM_POSSIBLE_ANSWER;
12 | int right = MAXIMUM_POSSIBLE_ANSWER;
13 |
14 | while (left <= right) {
15 | int mid = left + (right - left) / 2;
16 |
17 | if (check(mid)) {
18 | left = mid + 1;
19 | } else {
20 | right = mid - 1;
21 | }
22 | }
23 |
24 | return right;
25 | }
26 |
--------------------------------------------------------------------------------
/src/code/cpp/binary_search/greedy_minimum.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | bool check(int x) {
7 | return BOOLEAN;
8 | }
9 |
10 | int fn(vector& arr) {
11 | int left = MINIMUM_POSSIBLE_ANSWER;
12 | int right = MAXIMUM_POSSIBLE_ANSWER;
13 |
14 | while (left <= right) {
15 | int mid = left + (right - left) / 2;
16 |
17 | if (check(mid)) {
18 | right = mid - 1;
19 | } else {
20 | left = mid + 1;
21 | }
22 | }
23 |
24 | return left;
25 | }
26 |
--------------------------------------------------------------------------------
/src/code/cpp/binary_tree/bfs.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | int fn(TreeNode* root) {
7 | queue que;
8 | que.push(root);
9 | int ans = 0;
10 |
11 | while (!que.empty()) {
12 | int currentLength = que.size();
13 | // TODO: logic for current level
14 |
15 | for (int i = 0; i < currentLength; i++) {
16 | TreeNode* node = que.front();
17 | que.pop();
18 | // TODO: logic
19 | if (node->left != nullptr) {
20 | que.push(node->left);
21 | }
22 | if (node->right != nullptr) {
23 | que.push(node->right);
24 | }
25 | }
26 | }
27 |
28 | return ans;
29 | }
30 |
--------------------------------------------------------------------------------
/src/code/cpp/binary_tree/dfs_iterative.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | int dfs(TreeNode* root) {
7 | stack stack;
8 | stack.push(root);
9 | int ans = 0;
10 |
11 | while (!stack.empty()) {
12 | TreeNode* node = stack.top();
13 | stack.pop();
14 | // TODO: logic
15 | if (node->left) {
16 | stack.push(node->left);
17 | }
18 | if (node->right) {
19 | stack.push(node->right);
20 | }
21 | }
22 |
23 | return ans;
24 | }
25 |
--------------------------------------------------------------------------------
/src/code/cpp/binary_tree/dfs_recursive.cpp:
--------------------------------------------------------------------------------
1 | int dfs(TreeNode* root) {
2 | if (root == nullptr) {
3 | return 0;
4 | }
5 |
6 | int ans = 0;
7 |
8 | // TODO: logic
9 | dfs(root.left);
10 | dfs(root.right);
11 |
12 | return ans;
13 | }
14 |
--------------------------------------------------------------------------------
/src/code/cpp/bit_manipulation/check_power_of_two.cpp:
--------------------------------------------------------------------------------
1 | bool is_power_of_two(int num) {
2 | return (num & (num - 1)) == 0;
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/cpp/bit_manipulation/clear_kth_bit.cpp:
--------------------------------------------------------------------------------
1 | int clear_kth_bit(int num, int k) {
2 | return num & ~(1 << k);
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/cpp/bit_manipulation/count_set_bits.cpp:
--------------------------------------------------------------------------------
1 | int count_set_bits(int num) {
2 | int count = 0;
3 |
4 | while (num) {
5 | count += num & 1;
6 | num >>= 1;
7 | }
8 |
9 | return count;
10 | }
11 |
--------------------------------------------------------------------------------
/src/code/cpp/bit_manipulation/divide_power_of_two.cpp:
--------------------------------------------------------------------------------
1 | int divide_by_power_of_two(int num, int k) {
2 | return num >> k;
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/cpp/bit_manipulation/get_rightmost_bit.cpp:
--------------------------------------------------------------------------------
1 | int get_rightmost_set_bit(int num) {
2 | return num & -num;
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/cpp/bit_manipulation/multiply_power_of_two.cpp:
--------------------------------------------------------------------------------
1 | int multiply_by_power_of_two(int num, int k) {
2 | return num << k;
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/cpp/bit_manipulation/set_kth_bit.cpp:
--------------------------------------------------------------------------------
1 | int set_kth_bit(int num, int k) {
2 | return num | (1 << k);
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/cpp/bit_manipulation/swap_variables.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | tuple swap_variables(int num1, int num2) {
7 | num1 ^= num2;
8 | num2 ^= num1;
9 | num1 ^= num2;
10 | return std::make_tuple(num1, num2);
11 | }
12 |
--------------------------------------------------------------------------------
/src/code/cpp/bit_manipulation/test_kth_bit.cpp:
--------------------------------------------------------------------------------
1 | bool test_kth_bit(int num, int k) {
2 | return (num & (1 << k)) != 0;
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/cpp/bit_manipulation/toggle_kth_bit.cpp:
--------------------------------------------------------------------------------
1 | int toggle_kth_bit(int num, int k) {
2 | return num ^ (1 << k);
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/cpp/data_structures/array.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | using namespace std;
5 |
6 |
7 | template
8 | class Array {
9 | private:
10 | T* data;
11 | size_t size;
12 |
13 | public:
14 | Array(size_t size) : size(size) {
15 | data = new T[size];
16 | }
17 |
18 | ~Array() {
19 | delete[] data;
20 | }
21 |
22 | T& operator[](size_t index) {
23 | if (index >= size) {
24 | throw std::out_of_range("Index out of range");
25 | }
26 | return data[index];
27 | }
28 |
29 | const T& operator[](size_t index) const {
30 | if (index >= size) {
31 | throw out_of_range("Index out of range");
32 | }
33 | return data[index];
34 | }
35 |
36 | size_t len() const {
37 | return size;
38 | }
39 |
40 | friend ostream& operator<<(ostream& os, const Array& arr) {
41 | os << "[";
42 | for (size_t i = 0; i < arr.size; ++i) {
43 | os << arr.data[i];
44 | if (i < arr.size - 1) {
45 | os << ", ";
46 | }
47 | }
48 | os << "]";
49 | return os;
50 | }
51 | };
52 |
--------------------------------------------------------------------------------
/src/code/cpp/data_structures/binary_tree.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | using namespace std;
6 |
7 |
8 | template
9 | class BinaryTree {
10 | private:
11 | shared_ptr> root;
12 |
13 | public:
14 | BinaryTree() : root(nullptr) {}
15 |
16 | void insert(const T& data) {
17 | root = insertNode(root, data);
18 | }
19 |
20 | shared_ptr> insertNode(shared_ptr> node, const T& data) {
21 | if (!node) {
22 | return make_shared>(data);
23 | }
24 |
25 | if (!node->left) {
26 | node->left = make_shared>(data);
27 | } else if (!node->right) {
28 | node->right = make_shared>(data);
29 | } else {
30 | node->left = insertNode(node->left, data);
31 | }
32 |
33 | return node;
34 | }
35 |
36 | string printTree() const {
37 | return root ? printNode(root, "", true) : "Empty tree";
38 | }
39 |
40 | string printNode(const shared_ptr>& node, const string& prefix, bool isLeft) const {
41 | string result;
42 | if (node) {
43 | result += printNode(node->right, prefix + (isLeft ? "│ " : " "), false);
44 | result += prefix + (isLeft ? "└── " : "┌── ") + to_string(node->data) + "\n";
45 | result += printNode(node->left, prefix + (isLeft ? " " : "│ "), true);
46 | }
47 | return result;
48 | }
49 | };
50 |
--------------------------------------------------------------------------------
/src/code/cpp/data_structures/graph.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 |
6 | using namespace std;
7 |
8 |
9 | class Graph {
10 | private:
11 | unordered_map> graph;
12 |
13 | public:
14 | Graph() {}
15 |
16 | void addVertex(const string& vertex) {
17 | if (graph.find(vertex) == graph.end()) {
18 | graph[vertex] = {};
19 | }
20 | }
21 |
22 | void addEdge(const string& a, const string& b) {
23 | addVertex(a);
24 | addVertex(b);
25 | graph[a].push_back(b);
26 | graph[b].push_back(a);
27 | }
28 |
29 | vector getNeighbors(const string& vertex) {
30 | return graph[vertex];
31 | }
32 |
33 | string toString() {
34 | string output;
35 |
36 | for (const auto& [vertex, neighbors] : graph) {
37 | output += vertex + " - ";
38 |
39 | for (const auto& neighbor : neighbors) {
40 | output += neighbor + " - ";
41 | }
42 |
43 | output.pop_back();
44 | output.pop_back();
45 | output += "\n";
46 | }
47 |
48 | return output;
49 | }
50 | };
51 |
--------------------------------------------------------------------------------
/src/code/cpp/data_structures/hash_map.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | using namespace std;
5 |
6 |
7 | template
8 | class HashMap {
9 | private:
10 | const size_t size = 100000;
11 | vector> buckets[size];
12 |
13 | size_t hash(const KeyType& key) {
14 | return hash{}(key) % size;
15 | }
16 |
17 | public:
18 | HashMap() {}
19 |
20 | void setItem(const KeyType& key, const ValueType& value) {
21 | size_t index = hash(key);
22 |
23 | for (auto& pair : buckets[index]) {
24 | if (pair.first == key) {
25 | pair.second = value;
26 | return;
27 | }
28 | }
29 |
30 | buckets[index].emplace_back(key, value);
31 | }
32 |
33 | ValueType& getItem(const KeyType& key) {
34 | size_t index = hash(key);
35 |
36 | for (auto& pair : buckets[index]) {
37 | if (pair.first == key) {
38 | return pair.second;
39 | }
40 | }
41 |
42 | throw out_of_range("Key not found");
43 | }
44 |
45 | void delItem(const KeyType& key) {
46 | size_t index = hash(key);
47 |
48 | for (auto it = buckets[index].begin(); it != buckets[index].end(); ++it) {
49 | if (it->first == key) {
50 | buckets[index].erase(it);
51 | return;
52 | }
53 | }
54 | }
55 | };
56 |
--------------------------------------------------------------------------------
/src/code/cpp/data_structures/union_find.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | using namespace std;
6 |
7 |
8 | class UnionFind {
9 | private:
10 | vector root;
11 |
12 | public:
13 | UnionFind(int n) : root(n) {
14 | for (int i = 0; i < n; ++i) {
15 | root[i] = i;
16 | }
17 | }
18 |
19 | int find(int a) {
20 | return a == root[a] ? a : root[a] = find(root[a]);
21 | }
22 |
23 | void unionSets(int a, int b) {
24 | root[find(a)] = find(b);
25 | }
26 |
27 | bool connected(int a, int b) {
28 | return find(a) == find(b);
29 | }
30 |
31 | string toString() {
32 | int n = root.size();
33 | vector> components(n);
34 |
35 | for (int i = 0; i < n; ++i) {
36 | components[find(i)].push_back(i);
37 | }
38 |
39 | string result;
40 |
41 | for (const auto& component : components) {
42 | if (!component.empty()) {
43 | for (int node : component) {
44 | result += "(" + to_string(node) + ") - ";
45 | }
46 | result.pop_back();
47 | result.pop_back();
48 | result += "\n";
49 | }
50 | }
51 |
52 | return result;
53 | }
54 | };
55 |
--------------------------------------------------------------------------------
/src/code/cpp/dynamic_programming/bottom_up.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | using namespace std;
5 |
6 |
7 | int fn(int arr[], int size) {
8 | if (BASE_CASE) {
9 | return 0;
10 | }
11 |
12 | vector dp(STATE_FOR_WHOLE_INPUT + 1, BASE_CASE);
13 |
14 | for (int state = SMALLEST_SUBPROBLEM; state <= STATE_FOR_WHOLE_INPUT; ++state) {
15 | if (BASE_CASE) {
16 | dp[state] = BASE_CASE;
17 | } else {
18 | dp[state] = RECURRENCE_RELATION(state);
19 | }
20 | }
21 |
22 | return dp[STATE_FOR_WHOLE_INPUT];
23 | }
24 |
--------------------------------------------------------------------------------
/src/code/cpp/dynamic_programming/kadane.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | using namespace std;
5 |
6 |
7 | int kadane(vector& arr) {
8 | int curr_sub = arr[0];
9 | int max_sub = arr[0];
10 |
11 | for (size_t i = 1; i < arr.size(); ++i) {
12 | curr_sub = max(curr_sub + arr[i], arr[i]);
13 | max_sub = max(max_sub, curr_sub);
14 | }
15 |
16 | return max_sub;
17 | }
18 |
--------------------------------------------------------------------------------
/src/code/cpp/dynamic_programming/top_down.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | unordered_map memo;
7 |
8 | int fn(vector& arr) {
9 | return dp(STATE_FOR_WHOLE_INPUT, arr);
10 | }
11 |
12 | int dp(STATE, vector& arr) {
13 | if (BASE_CASE) {
14 | return 0;
15 | }
16 |
17 | if (memo.find(STATE) != memo.end()) {
18 | return memo[STATE];
19 | }
20 |
21 | int ans = RECURRENCE_RELATION(STATE);
22 | memo[STATE] = ans;
23 | return ans;
24 | }
25 |
--------------------------------------------------------------------------------
/src/code/cpp/graph/bellman_ford.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | using namespace std;
6 |
7 |
8 | vector bellman_ford(int n, vector, int>>& edges, int source) {
9 | vector distances(n, numeric_limits::max());
10 | distances[source] = 0;
11 |
12 | for (int i = 0; i < n - 1; ++i) {
13 | for (const auto& edge : edges) {
14 | int u = edge.first.first;
15 | int v = edge.first.second;
16 | int w = edge.second;
17 |
18 | if (distances[u] != numeric_limits::max() && distances[u] + w < distances[v]) {
19 | distances[v] = distances[u] + w;
20 | }
21 | }
22 | }
23 |
24 | for (const auto& edge : edges) {
25 | int u = edge.first.first;
26 | int v = edge.first.second;
27 | int w = edge.second;
28 |
29 | if (distances[u] != numeric_limits::max() && distances[u] + w < distances[v]) {
30 | return vector();
31 | }
32 | }
33 |
34 | return distances;
35 | }
36 |
--------------------------------------------------------------------------------
/src/code/cpp/graph/bfs.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | using namespace std;
6 |
7 |
8 | int fn(vector>& graph) {
9 | queue que;
10 | unordered_set seen;
11 | que.push(START_NODE);
12 | seen.insert(START_NODE);
13 | int ans = 0;
14 |
15 | while (!que.empty()) {
16 | int node = que.front();
17 | que.pop();
18 | // TODO: logic
19 | for (int neighbor: graph[node]) {
20 | if (seen.find(neighbor) == seen.end()) {
21 | seen.insert(neighbor);
22 | que.push(neighbor);
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/code/cpp/graph/dfs_iterative.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | using namespace std;
6 |
7 |
8 | int fn(vector>& graph) {
9 | stack stack;
10 | unordered_set seen;
11 | stack.push(START_NODE);
12 | seen.insert(START_NODE);
13 | int ans = 0;
14 |
15 | while (!stack.empty()) {
16 | int node = stack.top();
17 | stack.pop();
18 | // TODO: logic
19 | for (int neighbor: graph[node]) {
20 | if (seen.find(neighbor) == seen.end()) {
21 | seen.insert(neighbor);
22 | stack.push(neighbor);
23 | }
24 | }
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/src/code/cpp/graph/dfs_recursive.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | using namespace std;
5 |
6 |
7 | unordered_set seen;
8 |
9 | int fn(vector>& graph) {
10 | seen.insert(START_NODE);
11 | return dfs(START_NODE, graph);
12 | }
13 |
14 | int dfs(int node, vector>& graph) {
15 | int ans = 0;
16 | // TODO: logic
17 | for (int neighbor: graph[node]) {
18 | if (seen.find(neighbor) == seen.end()) {
19 | seen.insert(neighbor);
20 | ans += dfs(neighbor, graph);
21 | }
22 | }
23 |
24 | return ans;
25 | }
26 |
--------------------------------------------------------------------------------
/src/code/cpp/graph/dijkstra.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 | #include
5 |
6 | using namespace std;
7 |
8 |
9 | vector dijkstra(vector>>& graph, int source) {
10 | int n = graph.size();
11 | vector distances(n, INT_MAX);
12 | distances[source] = 0;
13 |
14 | priority_queue, vector>, greater>> heap;
15 | heap.push({0, source});
16 |
17 | while (!heap.empty()) {
18 | int currDist = heap.top().first;
19 | int node = heap.top().second;
20 | heap.pop();
21 |
22 | if (currDist > distances[node]) {
23 | continue;
24 | }
25 |
26 | for (pair edge : graph[node]) {
27 | int neighbor = edge.first;
28 | int weight = edge.second;
29 | int dist = currDist + weight;
30 |
31 | if (dist < distances[neighbor]) {
32 | distances[neighbor] = dist;
33 | heap.push({dist, neighbor});
34 | }
35 | }
36 | }
37 |
38 | return distances;
39 | }
40 |
--------------------------------------------------------------------------------
/src/code/cpp/graph/kahn.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | using namespace std;
6 |
7 |
8 | vector kahn_topological_sort(unordered_map>& graph) {
9 | vector result;
10 | unordered_map indegree;
11 |
12 | for (auto& [node, neighbors] : graph) {
13 | for (int neighbor : neighbors) {
14 | indegree[neighbor]++;
15 | }
16 | }
17 |
18 | queue que;
19 |
20 | for (auto& [node, _] : graph) {
21 | if (indegree[node] == 0) {
22 | que.push(node);
23 | }
24 | }
25 |
26 | while (!que.empty()) {
27 | int node = que.front();
28 | que.pop();
29 | result.push_back(node);
30 |
31 | for (int neighbor : graph[node]) {
32 | indegree[neighbor]--;
33 | if (indegree[neighbor] == 0) {
34 | que.push(neighbor);
35 | }
36 | }
37 | }
38 |
39 | return (result.size() == graph.size()) ? result : vector();
40 | }
41 |
--------------------------------------------------------------------------------
/src/code/cpp/graph/kruskal.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | using namespace std;
5 |
6 |
7 | vector> kruskal_mst(int n, vector>& edges) {
8 | vector> mst;
9 | UnionFind uf(n);
10 | sort(edges.begin(), edges.end());
11 |
12 | for (auto& [w, u, v] : edges) {
13 | if (!uf.connected(u, v)) {
14 | uf.unionNodes(u, v);
15 | mst.emplace_back(w, u, v);
16 | }
17 | }
18 |
19 | return mst;
20 | }
21 |
--------------------------------------------------------------------------------
/src/code/cpp/graph/prim.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | using namespace std;
6 |
7 |
8 | vector> prim_mst(int n, vector>& edges) {
9 | vector> mst;
10 | UnionFind uf(n);
11 | make_heap(edges.begin(), edges.end());
12 |
13 | while (!edges.empty()) {
14 | auto [w, u, v] = edges.front();
15 | pop_heap(edges.begin(), edges.end());
16 | edges.pop_back();
17 |
18 | if (!uf.connected(u, v)) {
19 | uf.unionNodes(u, v);
20 | mst.emplace_back(w, u, v);
21 | }
22 | }
23 |
24 | return mst;
25 | }
26 |
--------------------------------------------------------------------------------
/src/code/cpp/hash_map/find_number_of_subarrays.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | using namespace std;
5 |
6 |
7 | int fn(vector& arr, int k) {
8 | unordered_map counts;
9 | counts[0] = 1;
10 | int ans = 0;
11 | int curr = 0;
12 |
13 | for (int num : arr) {
14 | // TODO: logic to change curr
15 | ans += counts[curr - k];
16 | counts[curr]++;
17 | }
18 |
19 | return ans;
20 | }
21 |
--------------------------------------------------------------------------------
/src/code/cpp/hash_map/sliding_window.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | using namespace std;
5 |
6 |
7 | int fn(vector& arr) {
8 | unordered_set window;
9 | int ans = 0;
10 | int left = 0;
11 |
12 | for (int right = 0; right < arr.size(); right++) {
13 | // TODO: add arr[right] to window
14 |
15 | while (WINDOW_CONDITION_BROKEN) {
16 | // TODO: remove arr[left] from window
17 | left++;
18 | }
19 |
20 | // TODO: update ans
21 | }
22 |
23 | return ans;
24 | }
25 |
--------------------------------------------------------------------------------
/src/code/cpp/heap/find_top_k_elements.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | using namespace std;
5 |
6 |
7 | vector fn(vector& arr, int k) {
8 | priority_queue, greater> min_heap;
9 | vector result;
10 |
11 | for (int num : arr) {
12 | // TODO: logic to push onto heap according to problem's criteria
13 | min_heap.push(num);
14 |
15 | if (min_heap.size() > k) {
16 | min_heap.pop();
17 | }
18 | }
19 |
20 | while (!min_heap.empty()) {
21 | result.push_back(min_heap.top());
22 | min_heap.pop();
23 | }
24 |
25 | return result;
26 | }
27 |
--------------------------------------------------------------------------------
/src/code/cpp/linked_list/fast_and_slow_pointer.cpp:
--------------------------------------------------------------------------------
1 | int fn(ListNode* head) {
2 | ListNode* slow = head;
3 | ListNode* fast = head;
4 | int ans = 0;
5 |
6 | while (fast && fast->next) {
7 | // TODO: logic
8 | slow = slow->next;
9 | fast = fast->next->next;
10 | }
11 |
12 | return ans;
13 | }
14 |
--------------------------------------------------------------------------------
/src/code/cpp/linked_list/reverse_linked_list.cpp:
--------------------------------------------------------------------------------
1 | ListNode* fn(ListNode* head) {
2 | ListNode* prev = nullptr;
3 | ListNode* curr = head;
4 |
5 | while (curr) {
6 | ListNode* nxt = curr->next;
7 | curr->next = prev;
8 | prev = curr;
9 | curr = nxt;
10 | }
11 |
12 | return prev;
13 | }
14 |
--------------------------------------------------------------------------------
/src/code/cpp/matrix/create_copy.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | void fn(vector>& matrix) {
7 | int r = matrix.size();
8 | int c = matrix[0].size();
9 |
10 | vector> create_matrix(r, vector(c, 0));
11 | vector> copy_matrix(matrix);
12 | }
13 |
--------------------------------------------------------------------------------
/src/code/cpp/matrix/diagonals.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | void fn(vector>& matrix) {
7 | int r = matrix.size();
8 | int c = matrix[0].size();
9 |
10 | vector main_diagonal;
11 | vector anti_diagonal;
12 |
13 | for (int i = 0; i < min(r, c); ++i) {
14 | main_diagonal.push_back(matrix[i][i]);
15 | anti_diagonal.push_back(matrix[i][c - i - 1]);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/code/cpp/matrix/rotate_transpose.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | void fn(vector>& matrix) {
7 | int r = matrix.size();
8 | int c = matrix[0].size();
9 | vector> transpose(c, vector(r));
10 | vector> rotate_left(c, vector(r));
11 | vector> rotate_right(c, vector(r));
12 |
13 | for (int i = 0; i < r; ++i) {
14 | for (int j = 0; j < c; ++j) {
15 | transpose[j][i] = matrix[i][j];
16 | }
17 | }
18 |
19 | for (int i = 0; i < c; ++i) {
20 | for (int j = 0; j < r; ++j) {
21 | rotate_left[i][j] = transpose[c - i - 1][j];
22 | }
23 | }
24 |
25 | for (int i = 0; i < c; ++i) {
26 | for (int j = 0; j < r; ++j) {
27 | rotate_right[i][j] = transpose[i][r - j - 1];
28 | }
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/code/cpp/sorting_algorithms/bogo_sort.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | using namespace std;
6 |
7 |
8 | void BogoSort(vector& arr) {
9 | vector target = arr;
10 | sort(target.begin(), target.end());
11 |
12 | random_device rd;
13 | mt19937 g(rd());
14 |
15 | while (!is_sorted(arr.begin(), arr.end())) {
16 | shuffle(arr.begin(), arr.end(), g);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/src/code/cpp/sorting_algorithms/bubble_sort.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | void BubbleSort(vector& arr) {
7 | int n = arr.size();
8 |
9 | for (int i = 0; i < n; ++i) {
10 | bool swapped = false;
11 |
12 | for (int j = 0; j < n - i - 1; ++j) {
13 | if (arr[j] > arr[j + 1]) {
14 | std::swap(arr[j], arr[j + 1]);
15 | swapped = true;
16 | }
17 | }
18 |
19 | if (!swapped) {
20 | break;
21 | }
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/src/code/cpp/sorting_algorithms/bucket_sort.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | using namespace std;
5 |
6 |
7 | vector BucketSort(vector& arr) {
8 | int num_buckets = 10;
9 | int min_num = *min_element(arr.begin(), arr.end());
10 | int max_num = *max_element(arr.begin(), arr.end());
11 | double bucket_size = static_cast(max_num - min_num) / num_buckets;
12 | vector> buckets(num_buckets);
13 | vector result;
14 |
15 | for (int num : arr) {
16 | int index = min(static_cast((num - min_num) / bucket_size), num_buckets - 1);
17 | buckets[index].push_back(num);
18 | }
19 |
20 | for (auto& bucket : buckets) {
21 | sort(bucket.begin(), bucket.end());
22 | result.insert(result.end(), bucket.begin(), bucket.end());
23 | }
24 |
25 | return result;
26 | }
27 |
--------------------------------------------------------------------------------
/src/code/cpp/sorting_algorithms/counting_sort.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | using namespace std;
5 |
6 |
7 | vector CountingSort(vector& arr) {
8 | int max_num = *max_element(arr.begin(), arr.end());
9 | int min_num = *min_element(arr.begin(), arr.end());
10 | int count_range = max_num - min_num + 1;
11 | vector count(count_range, 0);
12 | vector output(arr.size(), 0);
13 |
14 | for (int num : arr) {
15 | count[num - min_num]++;
16 | }
17 |
18 | for (int i = 1; i < count_range; ++i) {
19 | count[i] += count[i - 1];
20 | }
21 |
22 | for (int i = arr.size() - 1; i >= 0; --i) {
23 | output[count[arr[i] - min_num] - 1] = arr[i];
24 | count[arr[i] - min_num]--;
25 | }
26 |
27 | return output;
28 | }
29 |
--------------------------------------------------------------------------------
/src/code/cpp/sorting_algorithms/cube_sort.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | using namespace std;
6 |
7 |
8 | void CubeSort(vector& arr, int processors) {
9 | int n = arr.size();
10 | vector> subarrays;
11 | int subarray_size = n / processors;
12 |
13 | for (int i = 0; i < processors; ++i) {
14 | vector subarray(arr.begin() + i * subarray_size, arr.begin() + (i + 1) * subarray_size);
15 | sort(subarray.begin(), subarray.end());
16 | subarrays.push_back(subarray);
17 | }
18 |
19 | for (int dimension = 0; dimension < log2(processors); ++dimension) {
20 | for (int i = 0; i < processors; ++i) {
21 | int partner = i ^ (1 << dimension);
22 | vector merged;
23 | if (i < partner) {
24 | merged = subarrays[i];
25 | merged.insert(merged.end(), subarrays[partner].begin(), subarrays[partner].end());
26 | } else {
27 | merged = subarrays[partner];
28 | merged.insert(merged.end(), subarrays[i].begin(), subarrays[i].end());
29 | }
30 | sort(merged.begin(), merged.end());
31 | subarrays[i].assign(merged.begin(), merged.begin() + subarray_size);
32 | subarrays[partner].assign(merged.begin() + subarray_size, merged.end());
33 | }
34 | }
35 |
36 | arr.clear();
37 | for (auto& subarray : subarrays) {
38 | arr.insert(arr.end(), subarray.begin(), subarray.end());
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/src/code/cpp/sorting_algorithms/heap_sort.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | void Heapify(vector& arr, int n, int i) {
7 | int largest = i;
8 | int left = 2 * i + 1;
9 | int right = 2 * i + 2;
10 |
11 | if (left < n && arr[left] > arr[largest]) {
12 | largest = left;
13 | }
14 | if (right < n && arr[right] > arr[largest]) {
15 | largest = right;
16 | }
17 | if (largest != i) {
18 | swap(arr[i], arr[largest]);
19 | Heapify(arr, n, largest);
20 | }
21 | }
22 |
23 | void HeapSort(vector& arr) {
24 | int n = arr.size();
25 |
26 | for (int i = n / 2 - 1; i >= 0; --i) {
27 | Heapify(arr, n, i);
28 | }
29 | for (int i = n - 1; i > 0; --i) {
30 | swap(arr[0], arr[i]);
31 | Heapify(arr, i, 0);
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/src/code/cpp/sorting_algorithms/insertion_sort.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | void InsertionSort(vector& arr) {
7 | int n = arr.size();
8 |
9 | for (int i = 1; i < n; ++i) {
10 | int key = arr[i];
11 | int j = i - 1;
12 |
13 | while (j >= 0 && key < arr[j]) {
14 | arr[j + 1] = arr[j];
15 | --j;
16 | }
17 |
18 | arr[j + 1] = key;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/src/code/cpp/sorting_algorithms/merge_sort.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | vector Merge(vector& left, vector& right) {
7 | vector output;
8 |
9 | while (!left.empty() && !right.empty()) {
10 | int min_num = (left[0] <= right[0]) ? left[0] : right[0];
11 | output.push_back(min_num);
12 |
13 | if (left[0] <= right[0]) {
14 | left.erase(left.begin());
15 | } else {
16 | right.erase(right.begin());
17 | }
18 | }
19 |
20 | output.insert(output.end(), left.begin(), left.end());
21 | output.insert(output.end(), right.begin(), right.end());
22 |
23 | return output;
24 | }
25 |
26 | vector MergeSort(vector& arr) {
27 | int n = arr.size();
28 |
29 | if (n <= 1) {
30 | return arr;
31 | }
32 |
33 | int mid = n / 2;
34 | vector left(arr.begin(), arr.begin() + mid);
35 | vector right(arr.begin() + mid, arr.end());
36 |
37 | left = MergeSort(left);
38 | right = MergeSort(right);
39 |
40 | return Merge(left, right);
41 | }
42 |
--------------------------------------------------------------------------------
/src/code/cpp/sorting_algorithms/pancake_sort.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | int FindMaxIndex(vector& arr, int n) {
7 | int max_idx = 0;
8 |
9 | for (int i = 0; i < n; ++i) {
10 | if (arr[i] > arr[max_idx]) {
11 | max_idx = i;
12 | }
13 | }
14 |
15 | return max_idx;
16 | }
17 |
18 | void Flip(vector& arr, int i) {
19 | int left = 0;
20 |
21 | while (left < i) {
22 | swap(arr[left], arr[i]);
23 | left++;
24 | i--;
25 | }
26 | }
27 |
28 | void PancakeSort(vector& arr) {
29 | int n = arr.size();
30 |
31 | for (int size = n; size >= 2; --size) {
32 | int max_idx = FindMaxIndex(arr, size);
33 |
34 | if (max_idx != size - 1) {
35 | Flip(arr, max_idx);
36 | Flip(arr, size - 1);
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/code/cpp/sorting_algorithms/quick_sort.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | vector QuickSort(vector& arr) {
7 | int n = arr.size();
8 |
9 | if (n <= 1) {
10 | return arr;
11 | }
12 |
13 | int pivot = arr[n / 2];
14 | vector left, right;
15 |
16 | for (int x : arr) {
17 | if (x < pivot) {
18 | left.push_back(x);
19 | } else if (x > pivot) {
20 | right.push_back(x);
21 | }
22 | }
23 |
24 | left = QuickSort(left);
25 | right = QuickSort(right);
26 |
27 | left.push_back(pivot);
28 | left.insert(left.end(), right.begin(), right.end());
29 |
30 | return left;
31 | }
32 |
--------------------------------------------------------------------------------
/src/code/cpp/sorting_algorithms/radix_sort.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | void CountingSort(vector& arr, int exp) {
7 | int n = arr.size();
8 | vector output(n, 0);
9 | vector count(10, 0);
10 |
11 | for (int i = 0; i < n; ++i) {
12 | int idx = arr[i] / exp % 10;
13 | count[idx]++;
14 | }
15 |
16 | for (int i = 1; i < 10; ++i) {
17 | count[i] += count[i - 1];
18 | }
19 |
20 | for (int i = n - 1; i >= 0; --i) {
21 | int idx = arr[i] / exp % 10;
22 | output[count[idx] - 1] = arr[i];
23 | count[idx]--;
24 | }
25 |
26 | for (int i = 0; i < n; ++i) {
27 | arr[i] = output[i];
28 | }
29 | }
30 |
31 | void RadixSort(vector& arr) {
32 | int max_val = *max_element(arr.begin(), arr.end());
33 | int exp = 1;
34 |
35 | while (max_val / exp > 0) {
36 | CountingSort(arr, exp);
37 | exp *= 10;
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/src/code/cpp/sorting_algorithms/selection_sort.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | void SelectionSort(vector& arr) {
7 | int n = arr.size();
8 |
9 | for (int i = 0; i < n; ++i) {
10 | int min_i = i;
11 |
12 | for (int j = i + 1; j < n; ++j) {
13 | if (arr[j] < arr[min_i]) {
14 | min_i = j;
15 | }
16 | }
17 |
18 | if (min_i != i) {
19 | swap(arr[i], arr[min_i]);
20 | }
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/code/cpp/sorting_algorithms/shell_sort.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | using namespace std;
4 |
5 |
6 | void ShellSort(vector& arr) {
7 | int n = arr.size();
8 | vector gaps = {701, 301, 132, 57, 23, 10, 4, 1};
9 |
10 | for (int gap : gaps) {
11 | for (int i = gap; i < n; ++i) {
12 | int tmp = arr[i];
13 | int j = i;
14 |
15 | while (j >= gap && arr[j - gap] > tmp) {
16 | arr[j] = arr[j - gap];
17 | j -= gap;
18 | }
19 |
20 | if (j != i) {
21 | arr[j] = tmp;
22 | }
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/code/cpp/sorting_algorithms/sleep_sort.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | using namespace std;
6 |
7 |
8 | void Snorlax(double num, vector& arr) {
9 | this_thread::sleep_for(chrono::milliseconds(static_cast(num)));
10 | arr.push_back(num);
11 | }
12 |
13 | vector SleepSort(vector& arr) {
14 | vector sorted_arr;
15 | vector threads;
16 |
17 | for (double num : arr) {
18 | threads.emplace_back(Snorlax, num, ref(sorted_arr));
19 | }
20 |
21 | for (thread& t : threads) {
22 | t.join();
23 | }
24 |
25 | return sorted_arr;
26 | }
27 |
--------------------------------------------------------------------------------
/src/code/cpp/stack/monotonic_decreasing.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | using namespace std;
5 |
6 |
7 | int fn(vector& arr) {
8 | stack stack;
9 | int ans = 0;
10 |
11 | for (int num : arr) {
12 | while (!stack.empty() && stack.top() < num) {
13 | // TODO: logic
14 | stack.pop();
15 | }
16 | stack.push(num);
17 | }
18 |
19 | return ans;
20 | }
21 |
--------------------------------------------------------------------------------
/src/code/cpp/stack/monotonic_increasing.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | using namespace std;
5 |
6 |
7 | int fn(vector& arr) {
8 | stack stack;
9 | int ans = 0;
10 |
11 | for (int num : arr) {
12 | while (!stack.empty() && stack.top() > num) {
13 | // TODO: logic
14 | stack.pop();
15 | }
16 | stack.push(num);
17 | }
18 |
19 | return ans;
20 | }
21 |
--------------------------------------------------------------------------------
/src/code/java/array/prefix_sum.java:
--------------------------------------------------------------------------------
1 | import java.util.ArrayList;
2 | import java.util.List;
3 |
4 |
5 | public int[] fn(int[] arr) {
6 | int n = arr.length;
7 | int[] prefix = new int[n];
8 | prefix[0] = arr[0];
9 |
10 | for (int i = 1; i < n; i++) {
11 | prefix[i] = prefix[i - 1] + arr[i];
12 | }
13 |
14 | return prefix;
15 | }
16 |
--------------------------------------------------------------------------------
/src/code/java/array/sliding_window.java:
--------------------------------------------------------------------------------
1 | public int fn(int[] arr) {
2 | int n = arr.length;
3 | int window = 0;
4 | int left = 0;
5 | int ans = 0;
6 |
7 | for (int right = 0; right < arr.length; right++) {
8 | // TODO: add arr[right] to window
9 |
10 | while (WINDOW_CONDITION_BROKEN) {
11 | // TODO: remove arr[left] from window
12 | left++;
13 | }
14 |
15 | // TODO: update ans
16 | }
17 |
18 | return ans;
19 | }
20 |
--------------------------------------------------------------------------------
/src/code/java/array/string_building.java:
--------------------------------------------------------------------------------
1 | public String fn(char[] strs) {
2 | StringBuilder sb = new StringBuilder();
3 |
4 | for (char c: strs) {
5 | sb.append(c);
6 | }
7 |
8 | return sb.toString();
9 | }
10 |
--------------------------------------------------------------------------------
/src/code/java/array/two_pointers_one_input.java:
--------------------------------------------------------------------------------
1 | public int fn(int[] arr) {
2 | int ans = 0;
3 | int left = 0;
4 | int right = arr.length - 1;
5 |
6 | while (left < right) {
7 | // TODO: logic with left and right
8 | if (CONDITION) {
9 | left++;
10 | } else {
11 | right--;
12 | }
13 | }
14 |
15 | return ans;
16 | }
17 |
--------------------------------------------------------------------------------
/src/code/java/array/two_pointers_two_inputs.java:
--------------------------------------------------------------------------------
1 | public int fn(int[] arr1, int[] arr2) {
2 | int i = 0;
3 | int j = 0;
4 | int ans = 0;
5 |
6 | while (i < arr1.length && j < arr2.length) {
7 | // TODO: logic
8 | if (CONDITION) {
9 | i++;
10 | } else {
11 | j++;
12 | }
13 | }
14 |
15 | while (i < arr1.length) {
16 | // TODO: logic
17 | i++;
18 | }
19 |
20 | while (j < arr2.length) {
21 | // TODO: logic
22 | j++;
23 | }
24 |
25 | return ans;
26 | }
27 |
--------------------------------------------------------------------------------
/src/code/java/backtracking/backtracking.java:
--------------------------------------------------------------------------------
1 | public int backtrack(STATE curr, OTHER_ARGUMENTS...) {
2 | if (BASE_CASE) {
3 | // TODO: modify answer
4 | return 0;
5 | }
6 |
7 | int ans = 0;
8 |
9 | for (ITERATE_OVER_INPUT) {
10 | // TODO: modify current state
11 | ans += backtrack(curr, OTHER_ARGUMENTS...);
12 | // TODO: undo modification of current state
13 | }
14 |
15 | return ans;
16 | }
17 |
--------------------------------------------------------------------------------
/src/code/java/binary_search/binary_search.java:
--------------------------------------------------------------------------------
1 | public int fn(int[] arr, int target) {
2 | int left = 0;
3 | int right = arr.length - 1;
4 |
5 | while (left <= right) {
6 | int mid = left + (right - left) / 2;
7 |
8 | if (arr[mid] == target) {
9 | // TODO: logic
10 | return mid;
11 | }
12 | if (arr[mid] > target) {
13 | right = mid - 1;
14 | } else {
15 | left = mid + 1;
16 | }
17 | }
18 |
19 | return left;
20 | }
21 |
--------------------------------------------------------------------------------
/src/code/java/binary_search/duplicate_elements_left_insertion.java:
--------------------------------------------------------------------------------
1 | public int fn(int[] arr, int target) {
2 | int left = 0;
3 | int right = arr.length;
4 |
5 | while (left < right) {
6 | int mid = left + (right - left) / 2;
7 |
8 | if (arr[mid] >= target) {
9 | right = mid;
10 | } else {
11 | left = mid + 1;
12 | }
13 | }
14 |
15 | return left;
16 | }
17 |
--------------------------------------------------------------------------------
/src/code/java/binary_search/duplicate_elements_right_insertion.java:
--------------------------------------------------------------------------------
1 | public int fn(int[] arr, int target) {
2 | int left = 0;
3 | int right = arr.length;
4 |
5 | while (left < right) {
6 | int mid = left + (right - left) / 2;
7 |
8 | if (arr[mid] > target) {
9 | right = mid;
10 | } else {
11 | left = mid + 1;
12 | }
13 | }
14 |
15 | return left;
16 | }
17 |
--------------------------------------------------------------------------------
/src/code/java/binary_search/greedy_maximum.java:
--------------------------------------------------------------------------------
1 | public int fn(int[] arr) {
2 | int left = MINIMUM_POSSIBLE_ANSWER;
3 | int right = MAXIMUM_POSSIBLE_ANSWER;
4 |
5 | while (left <= right) {
6 | int mid = left + (right - left) / 2;
7 |
8 | if (check(mid)) {
9 | left = mid + 1;
10 | } else {
11 | right = mid - 1;
12 | }
13 | }
14 |
15 | return right;
16 | }
17 |
18 | public boolean check(int x) {
19 | return BOOLEAN
20 | }
21 |
--------------------------------------------------------------------------------
/src/code/java/binary_search/greedy_minimum.java:
--------------------------------------------------------------------------------
1 | public int fn(int[] arr) {
2 | int left = MINIMUM_POSSIBLE_ANSWER;
3 | int right = MAXIMUM_POSSIBLE_ANSWER;
4 |
5 | while (left <= right) {
6 | int mid = left + (right - left) / 2;
7 |
8 | if (check(mid)) {
9 | right = mid - 1;
10 | } else {
11 | left = mid + 1;
12 | }
13 | }
14 |
15 | return left;
16 | }
17 |
18 | public boolean check(int x) {
19 | return BOOLEAN
20 | }
21 |
--------------------------------------------------------------------------------
/src/code/java/binary_tree/bfs.java:
--------------------------------------------------------------------------------
1 | import java.util.LinkedList;
2 | import java.util.Queue;
3 |
4 |
5 | public int fn(TreeNode root) {
6 | Queue que = new LinkedList<>();
7 | que.add(root);
8 | int ans = 0;
9 |
10 | while (!que.isEmpty()) {
11 | int currentLength = que.size();
12 | // TODO: logic for current level
13 | for (int i = 0; i < currentLength; i++) {
14 | TreeNode node = que.remove();
15 | // TODO: logic
16 | if (node.left != null) {
17 | que.add(node.left);
18 | }
19 | if (node.right != null) {
20 | que.add(node.right);
21 | }
22 | }
23 | }
24 |
25 | return ans;
26 | }
27 |
--------------------------------------------------------------------------------
/src/code/java/binary_tree/dfs_iterative.java:
--------------------------------------------------------------------------------
1 | import java.util.Stack;
2 |
3 |
4 | public int dfs(TreeNode root) {
5 | Stack stack = new Stack<>();
6 | stack.push(root);
7 | int ans = 0;
8 |
9 | while (!stack.isEmpty()) {
10 | TreeNode node = stack.pop();
11 | // TODO: logic
12 | if (node.left != null) {
13 | stack.push(node.left);
14 | }
15 | if (node.right != null) {
16 | stack.push(node.right);
17 | }
18 | }
19 |
20 | return ans;
21 | }
22 |
--------------------------------------------------------------------------------
/src/code/java/binary_tree/dfs_recursive.java:
--------------------------------------------------------------------------------
1 | public int dfs(TreeNode root) {
2 | if (root == null) {
3 | return 0;
4 | }
5 |
6 | int ans = 0;
7 |
8 | // TODO: logic
9 | ans += dfs(root.left);
10 | ans += dfs(root.right);
11 |
12 | return ans;
13 | }
14 |
--------------------------------------------------------------------------------
/src/code/java/bit_manipulation/check_power_of_two.java:
--------------------------------------------------------------------------------
1 | public boolean isPowerOfTwo(int num) {
2 | return (num & (num - 1)) == 0;
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/java/bit_manipulation/clear_kth_bit.java:
--------------------------------------------------------------------------------
1 | public int clearKthBit(int num, int k) {
2 | return num & ~(1 << k);
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/java/bit_manipulation/count_set_bits.java:
--------------------------------------------------------------------------------
1 | public int countSetBits(int num) {
2 | int count = 0;
3 |
4 | while (num > 0) {
5 | count += num & 1;
6 | num >>= 1;
7 | }
8 |
9 | return count;
10 | }
11 |
--------------------------------------------------------------------------------
/src/code/java/bit_manipulation/divide_power_of_two.java:
--------------------------------------------------------------------------------
1 | public int divideByPowerOfTwo(int num, int k) {
2 | return num >> k;
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/java/bit_manipulation/get_rightmost_bit.java:
--------------------------------------------------------------------------------
1 | public int getRightmostSetBit(int num) {
2 | return num & -num;
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/java/bit_manipulation/multiply_power_of_two.java:
--------------------------------------------------------------------------------
1 | public int multiplyByPowerOfTwo(int num, int k) {
2 | return num << k;
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/java/bit_manipulation/set_kth_bit.java:
--------------------------------------------------------------------------------
1 | public int setKthBit(int num, int k) {
2 | return num | (1 << k);
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/java/bit_manipulation/swap_variables.java:
--------------------------------------------------------------------------------
1 | public int[] swapVariables(int num1, int num2) {
2 | num1 ^= num2;
3 | num2 ^= num1;
4 | num1 ^= num2;
5 | return new int[] { num1, num2 };
6 | }
7 |
--------------------------------------------------------------------------------
/src/code/java/bit_manipulation/test_kth_bit.java:
--------------------------------------------------------------------------------
1 | public boolean testKthBit(int num, int k) {
2 | return (num & (1 << k)) != 0;
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/java/bit_manipulation/toggle_kth_bit.java:
--------------------------------------------------------------------------------
1 | public int toggleKthBit(int num, int k) {
2 | return num ^ (1 << k);
3 | }
4 |
--------------------------------------------------------------------------------
/src/code/java/data_structures/array.java:
--------------------------------------------------------------------------------
1 | public class Array {
2 | private int size;
3 | private T[] data;
4 |
5 | @SuppressWarnings("unchecked")
6 | public Array(int size) {
7 | this.size = size;
8 | this.data = (T[]) new Object[size];
9 | }
10 |
11 | public T get(int index) {
12 | if (index < 0 || index >= size) {
13 | throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
14 | }
15 | return data[index];
16 | }
17 |
18 | public void set(int index, T value) {
19 | if (index < 0 || index >= size) {
20 | throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
21 | }
22 | data[index] = value;
23 | }
24 |
25 | public int size() {
26 | return size;
27 | }
28 |
29 | @Override
30 | public String toString() {
31 | StringBuilder sb = new StringBuilder("[");
32 |
33 | for (int i = 0; i < size; i++) {
34 | sb.append(data[i]);
35 | if (i < size - 1) {
36 | sb.append(", ");
37 | }
38 | }
39 |
40 | sb.append("]");
41 | return sb.toString();
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/code/java/data_structures/binary_tree.java:
--------------------------------------------------------------------------------
1 | public class TreeNode {
2 | T data;
3 | TreeNode left;
4 | TreeNode right;
5 |
6 | public TreeNode(T data) {
7 | this.data = data;
8 | left = null;
9 | right = null;
10 | }
11 | }
12 |
13 | public class BinaryTree {
14 | TreeNode root;
15 |
16 | public BinaryTree() {
17 | root = null;
18 | }
19 |
20 | public void insert(T data) {
21 | root = insertNode(root, data);
22 | }
23 |
24 | private TreeNode insertNode(TreeNode node, T data) {
25 | if (node == null) {
26 | return new TreeNode<>(data);
27 | }
28 |
29 | if (node.left == null) {
30 | node.left = new TreeNode<>(data);
31 | } else if (node.right == null) {
32 | node.right = new TreeNode<>(data);
33 | } else {
34 | node.left = insertNode(node.left, data);
35 | }
36 |
37 | return node;
38 | }
39 |
40 | @Override
41 | public String toString() {
42 | return root == null ? "Empty tree" : printTree(root, "", true);
43 | }
44 |
45 | private String printTree(TreeNode node, String prefix, boolean isLeft) {
46 | if (node == null) {
47 | return "";
48 | }
49 |
50 | StringBuilder sb = new StringBuilder();
51 | sb.append(printTree(node.right, prefix + (isLeft ? "│ " : " "), false));
52 | sb.append(prefix).append(isLeft ? "└── " : "┌── ").append(node.data).append("\n");
53 | sb.append(printTree(node.left, prefix + (isLeft ? " " : "│ "), true));
54 |
55 | return sb.toString();
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/src/code/java/data_structures/graph.java:
--------------------------------------------------------------------------------
1 | import java.util.ArrayList;
2 | import java.util.HashMap;
3 | import java.util.List;
4 | import java.util.Map;
5 |
6 |
7 | public class Graph {
8 | Map> graph;
9 |
10 | public Graph() {
11 | graph = new HashMap<>();
12 | }
13 |
14 | public void addVertex(String vertex) {
15 | if (!graph.containsKey(vertex)) {
16 | graph.put(vertex, new ArrayList<>());
17 | }
18 | }
19 |
20 | public void addEdge(String a, String b) {
21 | addVertex(a);
22 | addVertex(b);
23 | graph.get(a).add(b);
24 | graph.get(b).add(a);
25 | }
26 |
27 | public List getNeighbors(String vertex) {
28 | return graph.getOrDefault(vertex, new ArrayList<>());
29 | }
30 |
31 | @Override
32 | public String toString() {
33 | StringBuilder output = new StringBuilder();
34 |
35 | for (Map.Entry> entry : graph.entrySet()) {
36 | output.append(entry.getKey()).append(" - ").append(String.join(" - ", entry.getValue())).append("\n");
37 | }
38 |
39 | return output.toString();
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/src/code/java/data_structures/hash_map.java:
--------------------------------------------------------------------------------
1 | public class HashMap {
2 | private int size;
3 | private Object[] bucket;
4 |
5 | public HashMap() {
6 | size = 100000;
7 | bucket = new Object[size];
8 | }
9 |
10 | private int hash(int key) {
11 | return key % size;
12 | }
13 |
14 | public void put(int key, Object value) {
15 | bucket[hash(key)] = value;
16 | }
17 |
18 | public Object get(int key) {
19 | return bucket[hash(key)];
20 | }
21 |
22 | public void remove(int key) {
23 | bucket[hash(key)] = null;
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/src/code/java/data_structures/union_find.java:
--------------------------------------------------------------------------------
1 | import java.util.ArrayList;
2 | import java.util.HashMap;
3 | import java.util.List;
4 | import java.util.Map;
5 |
6 |
7 | public class UnionFind {
8 | private int[] root;
9 |
10 | public UnionFind(int n) {
11 | this.root = new int[n];
12 | for (int i = 0; i < n; i++) {
13 | this.root[i] = i;
14 | }
15 | }
16 |
17 | public int find(int a) {
18 | if (a == root[a]) {
19 | return a;
20 | }
21 | return root[a] = find(root[a]);
22 | }
23 |
24 | public void union(int a, int b) {
25 | root[find(a)] = find(b);
26 | }
27 |
28 | public boolean connected(int a, int b) {
29 | return find(a) == find(b);
30 | }
31 |
32 | @Override
33 | public String toString() {
34 | int n = root.length;
35 | List> components = new ArrayList<>();
36 | Map> componentMap = new HashMap<>();
37 |
38 | for (int i = 0; i < n; i++) {
39 | int root = find(i);
40 |
41 | if (!componentMap.containsKey(root)) {
42 | componentMap.put(root, new ArrayList<>());
43 | }
44 |
45 | componentMap.get(root).add(i);
46 | }
47 |
48 | StringBuilder sb = new StringBuilder();
49 |
50 | for (List