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..479d5d5 --- /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..1c37af2 --- /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..b015e64 --- /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..fce7884 --- /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 + +