From f275f397bc40f45f46e9b2b302a0d6b3e2ee7249 Mon Sep 17 00:00:00 2001 From: Lusina <12752833+BrianLusina@users.noreply.github.com> Date: Thu, 12 Feb 2026 17:15:31 +0300 Subject: [PATCH 1/2] feat(algorithms, backtracking, subsets): find all subsets --- .../{ => backtracking}/subsets/__init__.py | 0 .../subsets/cascading_subsets/README.md | 0 .../subsets/cascading_subsets/__init__.py | 0 .../test_cascading_subsets.py | 2 +- .../subsets/find_all_subsets/README.md | 17 ++++ .../subsets/find_all_subsets/__init__.py | 65 +++++++++++++ .../examples/find_all_subsets_example_1.png | Bin .../examples/find_all_subsets_example_2.png | Bin .../examples/find_all_subsets_example_3.png | Bin .../examples/find_all_subsets_example_4.png | Bin .../find_all_subsets_ii_example_1.png | Bin 0 -> 24471 bytes .../find_all_subsets_ii_example_2.png | Bin 0 -> 22468 bytes .../find_all_subsets_ii_example_3.png | Bin 0 -> 25421 bytes .../find_all_subsets/test_find_all_subsets.py | 87 ++++++++++++++++++ .../subsets/find_all_subsets/__init__.py | 22 ----- .../find_all_subsets/test_find_all_subsets.py | 47 ---------- 16 files changed, 170 insertions(+), 70 deletions(-) rename algorithms/{ => backtracking}/subsets/__init__.py (100%) rename algorithms/{ => backtracking}/subsets/cascading_subsets/README.md (100%) rename algorithms/{ => backtracking}/subsets/cascading_subsets/__init__.py (100%) rename algorithms/{ => backtracking}/subsets/cascading_subsets/test_cascading_subsets.py (93%) rename algorithms/{ => backtracking}/subsets/find_all_subsets/README.md (55%) create mode 100644 algorithms/backtracking/subsets/find_all_subsets/__init__.py rename algorithms/{ => backtracking}/subsets/find_all_subsets/images/examples/find_all_subsets_example_1.png (100%) rename algorithms/{ => backtracking}/subsets/find_all_subsets/images/examples/find_all_subsets_example_2.png (100%) rename algorithms/{ => backtracking}/subsets/find_all_subsets/images/examples/find_all_subsets_example_3.png (100%) rename algorithms/{ => backtracking}/subsets/find_all_subsets/images/examples/find_all_subsets_example_4.png (100%) create mode 100644 algorithms/backtracking/subsets/find_all_subsets/images/examples/find_all_subsets_ii_example_1.png create mode 100644 algorithms/backtracking/subsets/find_all_subsets/images/examples/find_all_subsets_ii_example_2.png create mode 100644 algorithms/backtracking/subsets/find_all_subsets/images/examples/find_all_subsets_ii_example_3.png create mode 100644 algorithms/backtracking/subsets/find_all_subsets/test_find_all_subsets.py delete mode 100644 algorithms/subsets/find_all_subsets/__init__.py delete mode 100644 algorithms/subsets/find_all_subsets/test_find_all_subsets.py diff --git a/algorithms/subsets/__init__.py b/algorithms/backtracking/subsets/__init__.py similarity index 100% rename from algorithms/subsets/__init__.py rename to algorithms/backtracking/subsets/__init__.py diff --git a/algorithms/subsets/cascading_subsets/README.md b/algorithms/backtracking/subsets/cascading_subsets/README.md similarity index 100% rename from algorithms/subsets/cascading_subsets/README.md rename to algorithms/backtracking/subsets/cascading_subsets/README.md diff --git a/algorithms/subsets/cascading_subsets/__init__.py b/algorithms/backtracking/subsets/cascading_subsets/__init__.py similarity index 100% rename from algorithms/subsets/cascading_subsets/__init__.py rename to algorithms/backtracking/subsets/cascading_subsets/__init__.py diff --git a/algorithms/subsets/cascading_subsets/test_cascading_subsets.py b/algorithms/backtracking/subsets/cascading_subsets/test_cascading_subsets.py similarity index 93% rename from algorithms/subsets/cascading_subsets/test_cascading_subsets.py rename to algorithms/backtracking/subsets/cascading_subsets/test_cascading_subsets.py index d538abe6..b955e2da 100644 --- a/algorithms/subsets/cascading_subsets/test_cascading_subsets.py +++ b/algorithms/backtracking/subsets/cascading_subsets/test_cascading_subsets.py @@ -1,6 +1,6 @@ import unittest -from algorithms.subsets.cascading_subsets import each_cons +from algorithms.backtracking.subsets.cascading_subsets import each_cons class CascadingSubsetsTestCase(unittest.TestCase): diff --git a/algorithms/subsets/find_all_subsets/README.md b/algorithms/backtracking/subsets/find_all_subsets/README.md similarity index 55% rename from algorithms/subsets/find_all_subsets/README.md rename to algorithms/backtracking/subsets/find_all_subsets/README.md index 0fa1064c..a9e11c0a 100644 --- a/algorithms/subsets/find_all_subsets/README.md +++ b/algorithms/backtracking/subsets/find_all_subsets/README.md @@ -22,3 +22,20 @@ Given an array of integers, nums, find all possible subsets of nums, including t - Bit Manipulation - Backtracking - Arrays + +--- +# Subsets II + +Given an integer array nums, that can contain duplicate elements, return all possible subsets while ensuring that each +subset is unique. The output must include unique subsets, and you may return them in any order. + +## Constraints + +- 1 <= `nums.length` <= 10 +- -10 <= `nums[i]` <= 10 + +## Examples + +![Example 1](images/examples/find_all_subsets_ii_example_1.png) +![Example 2](images/examples/find_all_subsets_ii_example_2.png) +![Example 3](images/examples/find_all_subsets_ii_example_3.png) diff --git a/algorithms/backtracking/subsets/find_all_subsets/__init__.py b/algorithms/backtracking/subsets/find_all_subsets/__init__.py new file mode 100644 index 00000000..25c19797 --- /dev/null +++ b/algorithms/backtracking/subsets/find_all_subsets/__init__.py @@ -0,0 +1,65 @@ +from typing import List + + +def find_all_subsets(nums: List[int]) -> List[List[int]]: + n = len(nums) + + if n == 0: + return [] + + subsets = [] + + def backtrack(first, curr): + # Add the current subset to the output + subsets.append(curr[:]) + # Generate subsets starting from the current index + for i in range(first, n): + curr.append(nums[i]) + backtrack(i + 1, curr) + curr.pop() + + backtrack(0, []) + return subsets + + +def find_all_subsets_with_duplicates(nums: List[int]) -> List[List[int]]: + n = len(nums) + + if n == 0: + return [] + + # Sort in place to ensure that duplicate elements are next to each other, which will be used to skip over the duplicate + # elements in the iteration. + # Time complexity here is O(n log(n)) and space complexity is O(n) due to Timsort requiring space to handle sorting + # in place + nums.sort() + + subsets: List[int] = [] + result: List[List[int]] = [] + + def backtrack(idx: int) -> None: + """ + Backtrack to create subsets from the given current index of the element being considered + Args: + idx(int): index of the element being considered. + """ + # Base case, if we reach the end of the list, we include the current subset to the result + if idx == n: + result.append(subsets[:]) + return + + # Add the current subset to the output + # Include the current element to the subset and move to the next element + subsets.append(nums[idx]) + backtrack(idx + 1) + # After recursion, remove it to backtrack and explore the excluded path + subsets.pop() + + # Skip the current element(exclude path), but skip duplicates too. If there are duplicate elements, skip them all + # when choosing exclude path. This ensures that we only take one unique subset for each duplicate group + while idx + 1 < n and nums[idx] == nums[idx + 1]: + idx += 1 + backtrack(idx + 1) + + backtrack(0) + return result diff --git a/algorithms/subsets/find_all_subsets/images/examples/find_all_subsets_example_1.png b/algorithms/backtracking/subsets/find_all_subsets/images/examples/find_all_subsets_example_1.png similarity index 100% rename from algorithms/subsets/find_all_subsets/images/examples/find_all_subsets_example_1.png rename to algorithms/backtracking/subsets/find_all_subsets/images/examples/find_all_subsets_example_1.png diff --git a/algorithms/subsets/find_all_subsets/images/examples/find_all_subsets_example_2.png b/algorithms/backtracking/subsets/find_all_subsets/images/examples/find_all_subsets_example_2.png similarity index 100% rename from algorithms/subsets/find_all_subsets/images/examples/find_all_subsets_example_2.png rename to algorithms/backtracking/subsets/find_all_subsets/images/examples/find_all_subsets_example_2.png diff --git a/algorithms/subsets/find_all_subsets/images/examples/find_all_subsets_example_3.png b/algorithms/backtracking/subsets/find_all_subsets/images/examples/find_all_subsets_example_3.png similarity index 100% rename from algorithms/subsets/find_all_subsets/images/examples/find_all_subsets_example_3.png rename to algorithms/backtracking/subsets/find_all_subsets/images/examples/find_all_subsets_example_3.png diff --git a/algorithms/subsets/find_all_subsets/images/examples/find_all_subsets_example_4.png b/algorithms/backtracking/subsets/find_all_subsets/images/examples/find_all_subsets_example_4.png similarity index 100% rename from algorithms/subsets/find_all_subsets/images/examples/find_all_subsets_example_4.png rename to algorithms/backtracking/subsets/find_all_subsets/images/examples/find_all_subsets_example_4.png diff --git a/algorithms/backtracking/subsets/find_all_subsets/images/examples/find_all_subsets_ii_example_1.png b/algorithms/backtracking/subsets/find_all_subsets/images/examples/find_all_subsets_ii_example_1.png new file mode 100644 index 0000000000000000000000000000000000000000..59fb031ddf09630ccb370cdf61b5d4ab86641a4d GIT binary patch literal 24471 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 literal 0 HcmV?d00001 diff --git a/algorithms/backtracking/subsets/find_all_subsets/test_find_all_subsets.py b/algorithms/backtracking/subsets/find_all_subsets/test_find_all_subsets.py new file mode 100644 index 00000000..368374ff --- /dev/null +++ b/algorithms/backtracking/subsets/find_all_subsets/test_find_all_subsets.py @@ -0,0 +1,87 @@ +import unittest +from typing import List +from parameterized import parameterized +from algorithms.backtracking.subsets.find_all_subsets import ( + find_all_subsets, + find_all_subsets_with_duplicates, +) + +FIND_ALL_SUBSETS_TEST_CASES = [ + ([], []), + ([9], [[], [9]]), + ([1], [[], [1]]), + ([0], [[], [0]]), + ([2, 4], [[], [2], [4], [2, 4]]), + ([1, 2], [[], [1], [2], [1, 2]]), + ([2, 5, 7], [[], [2], [5], [2, 5], [7], [2, 7], [5, 7], [2, 5, 7]]), + ( + [1, 2, 3, 4], + [ + [], + [1], + [2], + [1, 2], + [3], + [1, 3], + [2, 3], + [1, 2, 3], + [4], + [1, 4], + [2, 4], + [1, 2, 4], + [3, 4], + [1, 3, 4], + [2, 3, 4], + [1, 2, 3, 4], + ], + ), + ([3, 6, 9], [[], [3], [3, 6], [3, 6, 9], [3, 9], [6], [6, 9], [9]]), + ([1, 2, 3], [[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]), +] + +FIND_ALL_SUBSETS_WITH_DUPLICATES_TEST_CASES = [ + ([0], [[], [0]]), + ([-1, 1], [[], [-1], [-1, 1], [1]]), + ([1, 2, 2], [[], [1], [1, 2], [1, 2, 2], [2], [2, 2]]), + ([0, 0], [[], [0], [0, 0]]), + ([-2, -2, 1], [[], [-2], [-2, -2], [-2, -2, 1], [-2, 1], [1]]), + ([1, 1], [[], [1], [1, 1]]), + ( + [4, 4, 4, 1, 4], + [ + [], + [1], + [1, 4], + [1, 4, 4], + [1, 4, 4, 4], + [1, 4, 4, 4, 4], + [4], + [4, 4], + [4, 4, 4], + [4, 4, 4, 4], + ], + ), +] +FIND_ALL_SUBSETS_WITH_DUPLICATES_TEST_CASES.extend(FIND_ALL_SUBSETS_TEST_CASES) + + +class FindAllSubsetsTestCase(unittest.TestCase): + @parameterized.expand(FIND_ALL_SUBSETS_TEST_CASES) + def test_find_all_subsets(self, nums: List[int], expected: List[List[int]]): + actual = find_all_subsets(nums) + expected_sorted = sorted(expected) + actual_sorted = sorted(actual) + self.assertEqual(expected_sorted, actual_sorted) + + @parameterized.expand(FIND_ALL_SUBSETS_WITH_DUPLICATES_TEST_CASES) + def test_find_all_subsets_with_duplicates( + self, nums: List[int], expected: List[List[int]] + ): + actual = find_all_subsets_with_duplicates(nums) + expected_sorted = sorted(expected) + actual_sorted = sorted(actual) + self.assertEqual(expected_sorted, actual_sorted) + + +if __name__ == "__main__": + unittest.main() diff --git a/algorithms/subsets/find_all_subsets/__init__.py b/algorithms/subsets/find_all_subsets/__init__.py deleted file mode 100644 index 016f6af7..00000000 --- a/algorithms/subsets/find_all_subsets/__init__.py +++ /dev/null @@ -1,22 +0,0 @@ -from typing import List - - -def find_all_subsets(nums: List[int]) -> List[List[int]]: - n = len(nums) - - if n == 0: - return [] - - subsets = [] - - def backtrack(first, curr): - # Add the current subset to the output - subsets.append(curr[:]) - # Generate subsets starting from the current index - for i in range(first, n): - curr.append(nums[i]) - backtrack(i + 1, curr) - curr.pop() - - backtrack(0, []) - return subsets diff --git a/algorithms/subsets/find_all_subsets/test_find_all_subsets.py b/algorithms/subsets/find_all_subsets/test_find_all_subsets.py deleted file mode 100644 index c237417b..00000000 --- a/algorithms/subsets/find_all_subsets/test_find_all_subsets.py +++ /dev/null @@ -1,47 +0,0 @@ -import unittest -from typing import List -from parameterized import parameterized -from algorithms.subsets.find_all_subsets import find_all_subsets - -FIND_ALL_SUBSETS_TEST_CASES = [ - ([], []), - ([9], [[], [9]]), - ([1], [[], [1]]), - ([0], [[], [0]]), - ([2, 4], [[], [2], [4], [2, 4]]), - ([1, 2], [[], [1], [2], [1, 2]]), - ([2, 5, 7], [[], [2], [5], [2, 5], [7], [2, 7], [5, 7], [2, 5, 7]]), - ( - [1, 2, 3, 4], - [ - [], - [1], - [2], - [1, 2], - [3], - [1, 3], - [2, 3], - [1, 2, 3], - [4], - [1, 4], - [2, 4], - [1, 2, 4], - [3, 4], - [1, 3, 4], - [2, 3, 4], - [1, 2, 3, 4], - ], - ), - ([3, 6, 9], [[], [3], [3, 6], [3, 6, 9], [3, 9], [6], [6, 9], [9]]), -] - - -class FindAllSubsetsTestCase(unittest.TestCase): - @parameterized.expand(FIND_ALL_SUBSETS_TEST_CASES) - def test_find_all_subsets(self, nums: List[int], expected: List[List[int]]): - actual = find_all_subsets(nums) - self.assertEqual(expected, actual) - - -if __name__ == "__main__": - unittest.main() From c27843926007514877a50c3e088c33c3be32d084 Mon Sep 17 00:00:00 2001 From: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Date: Thu, 12 Feb 2026 14:15:55 +0000 Subject: [PATCH 2/2] updating DIRECTORY.md --- DIRECTORY.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/DIRECTORY.md b/DIRECTORY.md index a15d17c3..410c8120 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -38,6 +38,11 @@ * [Test Generate Permutations](https://github.com/BrianLusina/PythonSnips/blob/master/algorithms/backtracking/permutations/generate_permutations/test_generate_permutations.py) * Restore Ip Addresses * [Test Restore Ip Addresses](https://github.com/BrianLusina/PythonSnips/blob/master/algorithms/backtracking/restore_ip_addresses/test_restore_ip_addresses.py) + * Subsets + * Cascading Subsets + * [Test Cascading Subsets](https://github.com/BrianLusina/PythonSnips/blob/master/algorithms/backtracking/subsets/cascading_subsets/test_cascading_subsets.py) + * Find All Subsets + * [Test Find All Subsets](https://github.com/BrianLusina/PythonSnips/blob/master/algorithms/backtracking/subsets/find_all_subsets/test_find_all_subsets.py) * Word Search * [Constants](https://github.com/BrianLusina/PythonSnips/blob/master/algorithms/backtracking/word_search/constants.py) * [Point](https://github.com/BrianLusina/PythonSnips/blob/master/algorithms/backtracking/word_search/point.py) @@ -307,11 +312,6 @@ * Stack * Daily Temperatures * [Test Daily Temperatures](https://github.com/BrianLusina/PythonSnips/blob/master/algorithms/stack/daily_temperatures/test_daily_temperatures.py) - * Subsets - * Cascading Subsets - * [Test Cascading Subsets](https://github.com/BrianLusina/PythonSnips/blob/master/algorithms/subsets/cascading_subsets/test_cascading_subsets.py) - * Find All Subsets - * [Test Find All Subsets](https://github.com/BrianLusina/PythonSnips/blob/master/algorithms/subsets/find_all_subsets/test_find_all_subsets.py) * Taxi Numbers * [Taxi Numbers](https://github.com/BrianLusina/PythonSnips/blob/master/algorithms/taxi_numbers/taxi_numbers.py) * Top K Elements