78.Subsets

25 年 7 月 16 日 星期三
238 字
2 分钟

Input perspective

python3
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        path = []
        n = len(nums)
        ans = []
        def dfs(i):
            if i == n:
                ans.append(path.copy()) #! copy
                return
            # 不选 not choose
            dfs(i+1)

            # choose 选
            path.append(nums[i])
            dfs(i+1)
            path.pop() # 默认弹最后一个元素
        dfs(0)
        return ans

“答案视角”就是把每一个子集看成一条“答案路径”,路径上的第 1 个节点是子集的第 1 个元素,第 2 个节点是子集的第 2 个元素,以此类推。我们在第 k 层递归里,不再是问“对某个固定的 nums 元素要不要选?”,而是问“子集的第 k 个位置应该放哪个元素?”

i表示下一步可从原数组 nums 的哪个下标开始选元素

Answer perspective

python3
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        path = []
        n = len(nums)
        ans = []
        def dfs(i):
            ans.append(path.copy()) #! copy
            if i == n:
                return
            for j in range(i, n):
                #
                path.append(nums[j])
                dfs(j+1) # j+1
                path.pop() # 默认弹最后一个元素 恢复现场
        dfs(0)
        return ans

文章标题:78.Subsets

文章作者:Sirui Chen

文章链接:https://blog.siruichen.me/posts/78subsets[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。