给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
思路:
本题有两种解法,第一种是属于python的作弊方法,第二种是属于回溯法的。首先讲第一种方法:
方法一:
使用了python的内置函数:itertools.combinations()来求解,效率奇快。
代码如下:
import itertools
class Solution(object):
# 此种解法也属于作弊,使用了python的内置函数:itertools.combinations()
def subsets(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
combine_list = [[]]
for index in range(len(nums)):
single_list = list(itertools.combinations(nums, index+1))
combine_list.extend(single_list)
return combine_list
if __name__ == "__main__":
nums = [1, 2, 3]
combine_list = Solution().subsets(nums)
print(combine_list)
执行效率在100%
方法二:
使用回溯法,关于回溯法我之前写了一篇文章,大家可以看看。
https://blog.csdn.net/weixin_36431280/article/details/84891567
看完之后应该就大体知道了回溯法的解题步骤,步骤如下:
class Solution(object):
# 本题亦可使用回溯法
def subsets(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
# 定义保存最终结果的集合
combine_list = [[]]
# 递归
def back(current_list=[], start=0):
for index in range(start, len(nums)):
current_list.append(nums[index])
combine_list.append(current_list[:])
back(current_list, index+1)
current_list.pop()
back()
return combine_list
if __name__ == "__main__":
nums = [1, 2, 3]
combine_list = Solution().subsets(nums)
print(combine_list)
执行效率在50%左右了。