LeetCode 78. 子集 / 90. 子集 II(Easy)/ 【排列】

本文介绍了解决子集、子集II、全排列及组合等问题的多种算法实现方案,包括回溯法和迭代法,并提供了详细的Python代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

子集
子集 II

题解

  1. 回溯算法

代码

  • 子集
class Solution:
    ### 0201 迭代(48 ms,15.1 MB)
    def subsets(self, nums: List[int]) -> List[List[int]]:
        res = [[]]

        for num in nums:
            # 上一轮res表示已有的组合
            # 列表生成式表示当前num与每一个已有组合进行搭配
            # 在加到本轮res中
            res += [[num] + sub for sub in res]

        return res
    
    ### 0201 迭代(40 ms,15 MB)
    def subsets(self, nums: List[int]) -> List[List[int]]:
        res, n = [], len(nums)

        # 从第0个数开始组合完,再从第1个数开始组合完,以此类推
        def dfs(i, sub):
            res.append(sub)

            # 从数i开始
            for j in range(i, n):
                dfs(j+1, [nums[j]] + sub)
        
        dfs(0, []) # 从第0个数开始

        return res
  • 子集 II
class Solution:
    ### 0201 递归 / 回溯(40 ms,15.1 MB)
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        res, n = [], len(nums)

        # 首先对数组排序,以便跳过相同值
        nums.sort()

        def dfs(idx, sub):
            res.append(sub)

            for j in range(idx, n):
                # 若j不是当前的第0个下标,且与前一个数相同,则跳过相同的值
                if j > idx and nums[j] == nums[j-1]:
                    continue
                
                dfs(j + 1, [nums[j]] + sub) # 注意:这里是[nums[j]],而非nums[j]
        
        dfs(0, [])

        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值