例题

1. 子集

image.png
代码
Python代码:

  1. def subsets(self, nums: List[int]) -> List[List[int]]:
  2. def generate(i, nums, path, res):
  3. if i == len(nums):
  4. return
  5. path.append(nums[i])
  6. # if tuple(path) not in s:
  7. res.append(path.copy())
  8. # s.add(tuple(path))
  9. generate(i+1, nums, path, res)
  10. path.pop()
  11. generate(i+1, nums, path, res)
  12. path = []
  13. res = [[]]
  14. s = set()
  15. generate(0, nums, path, res)
  16. return res

二进制:

  1. def subsets(self, nums: List[int]) -> List[List[int]]:
  2. n = len(nums)
  3. output = []
  4. for i in range(2**n, 2**(n + 1)):
  5. # generate bitmask, from 0..00 to 1..11
  6. bitmask = bin(i)[3:]
  7. # append subset corresponding to that bitmask
  8. output.append([nums[j] for j in range(n) if bitmask[j] == '1'])
  9. return output

2. 子集2

image.png
代码

  1. class Solution:
  2. def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
  3. nums.sort()
  4. subset, result = [], [[]]
  5. self.DFS(nums, 0, len(nums), subset, result)
  6. return result
  7. def DFS(self, nums, start, end, subset, result):
  8. for i in range(start, end):
  9. if i > start and nums[i] == nums[i-1]:
  10. continue
  11. subset.append(nums[i])
  12. result.append(subset[:])
  13. self.DFS(nums, i+1, end, subset, result)
  14. subset.pop()