力扣刷题Day 61:子集(78)
1.题目描述
2.思路
方法1:直接用Python内置函数itertools.combinations()。
方法2:回溯,参考了powcai佬的题解,nums = [1, 2, 3]的情况分析见下图。
方法3: 迭代,参考了powcai佬的题解 ,依次将新的元素添加到前面的结果列表里。
3.代码(Python3)
方法1:
class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:res = [[]]for i in range(0, len(nums)):res.extend(itertools.combinations(nums, i + 1))return res
方法2:
class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:def helper(i, tmp):res.append(tmp)for j in range(i, len(nums)):helper(j + 1, tmp + [nums[j]])res = []helper(0, [])return res
方法3:
class Solution:def subsets(self, nums: List[int]) -> List[List[int]]:res = [[]]for num in nums:res += [[num] + res_i for res_i in res]return res
4.执行情况
方法1:
方法2:
方法3:
5.感想
终于搞清楚递归和回溯到底有什么区别了。我好难自己写出递归算法,脑子像糨糊一样想不清楚。