From 4e3f85beac9a8073e4e1e26f80c76c3d3f9c8c46 Mon Sep 17 00:00:00 2001 From: tom4649 Date: Thu, 2 Jul 2026 20:39:43 +0900 Subject: [PATCH 1/2] step1,2,3 --- 0090.Subsets-II/memo.md | 28 ++++++++++++++++++++++ 0090.Subsets-II/step1_recursion.py | 17 +++++++++++++ 0090.Subsets-II/step1_recursion_revised.py | 16 +++++++++++++ 0090.Subsets-II/step1_subset.py | 16 +++++++++++++ 0090.Subsets-II/step1_subset_revised.py | 9 +++++++ 0090.Subsets-II/step2_backtrack.py | 22 +++++++++++++++++ 0090.Subsets-II/step3.py | 23 ++++++++++++++++++ 7 files changed, 131 insertions(+) create mode 100644 0090.Subsets-II/memo.md create mode 100644 0090.Subsets-II/step1_recursion.py create mode 100644 0090.Subsets-II/step1_recursion_revised.py create mode 100644 0090.Subsets-II/step1_subset.py create mode 100644 0090.Subsets-II/step1_subset_revised.py create mode 100644 0090.Subsets-II/step2_backtrack.py create mode 100644 0090.Subsets-II/step3.py diff --git a/0090.Subsets-II/memo.md b/0090.Subsets-II/memo.md new file mode 100644 index 0000000..5e82671 --- /dev/null +++ b/0090.Subsets-II/memo.md @@ -0,0 +1,28 @@ +# 90. Subsets II + +## step1 +Arai 60の問題を覚えていたので、その応用で解けた。12mほど。 + +時間、空間 O(n) + +Arai60の問題: https://leetcode.com/problems/subsets/ + +もう少し簡潔にもできる + +~~ バックトラック ~~ 再帰 でも解く + +subsets[:] とすれば extention という変数を用意しなくてもかける + +## 他の人のコード +https://leetcode.com/problems/subsets-ii/solutions/6877292/video-sorting-the-input-array-to-remove-wzqim/ + +バックトラックはこの方法だ + +再帰をバックトラックで書いたつもりになっていた + +## step2 +バックトラック +subsets.append(subset)として間違えた + +## step3 +バックトラック diff --git a/0090.Subsets-II/step1_recursion.py b/0090.Subsets-II/step1_recursion.py new file mode 100644 index 0000000..bd6daba --- /dev/null +++ b/0090.Subsets-II/step1_recursion.py @@ -0,0 +1,17 @@ +import collections + +class Solution: + def subsetsWithDup(self, nums: list[int]) -> list[list[int]]: + def update_subsets(subsets, num, count): + extention = [subset + [num] * i for i in range(1, count+1) for subset in subsets] + subsets.extend(extention) + + + num_to_count = collections.Counter(nums) + subsets = [[]] + for num, count in num_to_count.items(): + update_subsets(subsets, num, count) + + return subsets + + diff --git a/0090.Subsets-II/step1_recursion_revised.py b/0090.Subsets-II/step1_recursion_revised.py new file mode 100644 index 0000000..d597247 --- /dev/null +++ b/0090.Subsets-II/step1_recursion_revised.py @@ -0,0 +1,16 @@ +import collections + +class Solution: + def subsetsWithDup(self, nums: list[int]) -> list[list[int]]: + def update_subsets(subsets, num, count): + subsets.extend([subset + [num] * i for i in range(1, count+1) for subset in subsets[:]]) + + + num_to_count = collections.Counter(nums) + subsets = [[]] + for num, count in num_to_count.items(): + update_subsets(subsets, num, count) + + return subsets + + diff --git a/0090.Subsets-II/step1_subset.py b/0090.Subsets-II/step1_subset.py new file mode 100644 index 0000000..9dc919d --- /dev/null +++ b/0090.Subsets-II/step1_subset.py @@ -0,0 +1,16 @@ +import collections + +class Solution: + def subsetsWithDup(self, nums: list[int]) -> list[list[int]]: + num_to_count = collections.defaultdict(int) + for n in nums: + num_to_count[n] += 1 + + subsets = [[]] + for n, count in num_to_count.items(): + extention = [] + for i in range(1, count+1): + extention.extend([subset + [n] * i for subset in subsets]) + subsets.extend(extention) + + return subsets diff --git a/0090.Subsets-II/step1_subset_revised.py b/0090.Subsets-II/step1_subset_revised.py new file mode 100644 index 0000000..c85601b --- /dev/null +++ b/0090.Subsets-II/step1_subset_revised.py @@ -0,0 +1,9 @@ +import collections + +class Solution: + def subsetsWithDup(self, nums: list[int]) -> list[list[int]]: + num_to_count = collections.Counter(nums) + subsets = [[]] + for n, count in num_to_count.items(): + subsets.extend([subset + [n] * i for i in range(1, count+1) for subset in subsets]) + return subsets diff --git a/0090.Subsets-II/step2_backtrack.py b/0090.Subsets-II/step2_backtrack.py new file mode 100644 index 0000000..0d52255 --- /dev/null +++ b/0090.Subsets-II/step2_backtrack.py @@ -0,0 +1,22 @@ +class Solution: + def subsetsWithDup(self, nums: list[int]) -> list[list[int]]: + nums.sort() + + def update_subsets(subsets, i, subset): + if i == len(nums): + subsets.append(subset[:]) + return + + subset.append(nums[i]) + update_subsets(subsets, i+1, subset) + subset.pop() + while i + 1 < len(nums) and nums[i] == nums[i+1]: + i += 1 + update_subsets(subsets, i+1, subset) + + subsets = [] + update_subsets(subsets, 0, []) + + return subsets + + diff --git a/0090.Subsets-II/step3.py b/0090.Subsets-II/step3.py new file mode 100644 index 0000000..0ca92be --- /dev/null +++ b/0090.Subsets-II/step3.py @@ -0,0 +1,23 @@ +class Solution: + def subsetsWithDup(self, nums: list[int]) -> list[list[int]]: + nums.sort() + subsets = [] + + subset = [] + def update_subsets(i): + if i == len(nums): + subsets.append(subset[:]) + return + + subset.append(nums[i]) + update_subsets(i+1) + subset.pop() + while i + 1 < len(nums) and nums[i] == nums[i+1]: + i += 1 + update_subsets(i+1) + + update_subsets(0) + + return subsets + + From cf961301b8c35a9de482e6824a97f4d067f1d0e3 Mon Sep 17 00:00:00 2001 From: tom4649 Date: Sat, 4 Jul 2026 07:48:51 +0900 Subject: [PATCH 2/2] Add suggested changes --- 0090.Subsets-II/step1_recursion.py | 2 +- 0090.Subsets-II/step1_recursion_revised.py | 2 +- 0090.Subsets-II/step1_subset.py | 2 +- 0090.Subsets-II/step1_subset_revised.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/0090.Subsets-II/step1_recursion.py b/0090.Subsets-II/step1_recursion.py index bd6daba..479d5d5 100644 --- a/0090.Subsets-II/step1_recursion.py +++ b/0090.Subsets-II/step1_recursion.py @@ -3,7 +3,7 @@ class Solution: def subsetsWithDup(self, nums: list[int]) -> list[list[int]]: def update_subsets(subsets, num, count): - extention = [subset + [num] * i for i in range(1, count+1) for subset in subsets] + extention = [subset + [num] * i for i in range(1, count + 1) for subset in subsets] subsets.extend(extention) diff --git a/0090.Subsets-II/step1_recursion_revised.py b/0090.Subsets-II/step1_recursion_revised.py index d597247..1c37af2 100644 --- a/0090.Subsets-II/step1_recursion_revised.py +++ b/0090.Subsets-II/step1_recursion_revised.py @@ -3,7 +3,7 @@ class Solution: def subsetsWithDup(self, nums: list[int]) -> list[list[int]]: def update_subsets(subsets, num, count): - subsets.extend([subset + [num] * i for i in range(1, count+1) for subset in subsets[:]]) + subsets.extend([subset + [num] * i for i in range(1, count + 1) for subset in subsets[:]]) num_to_count = collections.Counter(nums) diff --git a/0090.Subsets-II/step1_subset.py b/0090.Subsets-II/step1_subset.py index 9dc919d..b015e64 100644 --- a/0090.Subsets-II/step1_subset.py +++ b/0090.Subsets-II/step1_subset.py @@ -9,7 +9,7 @@ def subsetsWithDup(self, nums: list[int]) -> list[list[int]]: subsets = [[]] for n, count in num_to_count.items(): extention = [] - for i in range(1, count+1): + for i in range(1, count + 1): extention.extend([subset + [n] * i for subset in subsets]) subsets.extend(extention) diff --git a/0090.Subsets-II/step1_subset_revised.py b/0090.Subsets-II/step1_subset_revised.py index c85601b..fce7884 100644 --- a/0090.Subsets-II/step1_subset_revised.py +++ b/0090.Subsets-II/step1_subset_revised.py @@ -5,5 +5,5 @@ def subsetsWithDup(self, nums: list[int]) -> list[list[int]]: num_to_count = collections.Counter(nums) subsets = [[]] for n, count in num_to_count.items(): - subsets.extend([subset + [n] * i for i in range(1, count+1) for subset in subsets]) + subsets.extend([subset + [n] * i for i in range(1, count + 1) for subset in subsets]) return subsets