Leetcode 78. 子集 ---- python(待刷第二遍)

1.题目描述

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。

示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]

2. 解题思路

解法1:

这题可以用回溯法,位运算法,但思路都比较难懂,以后再把这两种解法放上来。

下面代码用的是一种比较巧妙的方法:
集合中每添加一个元素,则子集数目增加一倍,且增加的子集为所有原始子集加上新的元素。
举个例子:nums=[1,2,3]

  • 初始时集合为空,子集为[ [] ]。
  • 添加一个元素1,即集合为[1]时,子集为空集和空集+元素1,即[ [], [1] ]。
  • 添加下一个元素2,集合为[1,2],子集除了包含上一步的所有集合还新增了对应集合+元素2的所有集合,即[ [], [1], [2],
    [1,2]],其中[2]是空集+元素2,[1,2]是[1]+元素2。
  • 添加下一个元素3,集合为[1,2,3],类似的得到子集为[ [], [1], [2], [1,2], [3], [1,3], [2,3],
    [1,2,3] ],其中[3]是空集+元素3,[1,3]是[1]+元素3,[2,3]是[2]+元素3,[1,2,3]是[1,2]+元素3。

代码实现

class Solution:
    def subsets(self, nums):
        result = [[]]
        lenResult = len(result)
        for i in nums:
            for j in range(lenResult):
                newTemp = result[j]+[i]
                if(newTemp not in result):
                    result.append(newTemp)
            if (newTemp not in result):
                result.append([i])
            lenResult = len(result)
        return (result)

解法2:(回溯法)
在这里插入图片描述
代码实现:

class Solution:
    def subsets(self, nums):
        self.results = []
        self.search(nums, [], 0)
        return self.results

    def search(self, nums, S, index):
        if index == len(nums):
            self.results.append(S)
            return

        self.search(nums, S + [nums[index]], index + 1)
        self.search(nums, S, index + 1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值