LeetCode #78 Subsets

题目

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
posted @ 2020-10-15 10:29  老鼠司令  阅读(63)  评论(0编辑  收藏  举报