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)