LeetCode #78 Subsets
题目
解题方法
级联法(DP):初始化output=[[]],遍历nums数组,将每一个元素与output里面所有现存元素组合成一个新的list,再加入到output中。
回溯法(backtrack):遍历子集的所有可能长度,构造所有可能出现的子集,从中选取与此次遍历的长度值相等的子集加入到结果中,遍历结束获得所有子集。
词典法(二进制映射法):将nums中的每一位映射到一个bitmask中,bitmask中的0代表该位置不出现,1代表出现,遍历所有可能出现的bitmask,并把每次映射的结果加入到输出中。
具体解释见力扣Solution..
代码
级联法:
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
output = [[]]
for i in range(len(nums)):
for j in range(len(output)):
output += [output[j] + [nums[i]]]
return output
回溯法:
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
def backtrack(first = 0, curr = []):
if len(curr) == k:
output.append(curr[:])
for i in range(first, n):
curr.append(nums[i])
backtrack(i + 1, curr)
curr.pop()
output = []
n = len(nums)
for k in range(n + 1):
backtrack()
return output
词典法:
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
output = []
for i in range(2**n, 2**(n + 1)):
bitmask = bin(i)[3:]
temp = []
for j in range(n):
if bitmask[j] == '1':
temp.append(nums[j])
output.append(temp)
return output