Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions 0090.Subsets-II/memo.md
Original file line number Diff line number Diff line change
@@ -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
バックトラック
17 changes: 17 additions & 0 deletions 0090.Subsets-II/step1_recursion.py
Original file line number Diff line number Diff line change
@@ -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


16 changes: 16 additions & 0 deletions 0090.Subsets-II/step1_recursion_revised.py
Original file line number Diff line number Diff line change
@@ -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


16 changes: 16 additions & 0 deletions 0090.Subsets-II/step1_subset.py
Original file line number Diff line number Diff line change
@@ -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
9 changes: 9 additions & 0 deletions 0090.Subsets-II/step1_subset_revised.py
Original file line number Diff line number Diff line change
@@ -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
22 changes: 22 additions & 0 deletions 0090.Subsets-II/step2_backtrack.py
Original file line number Diff line number Diff line change
@@ -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


23 changes: 23 additions & 0 deletions 0090.Subsets-II/step3.py
Original file line number Diff line number Diff line change
@@ -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