这个题目就是求子集,如【1,2】的子集就是【1】【2】【1,2】【】,别忘了空集。
我想到的最容易的做法就是分治,用递归的方法求,求完之后再加上空集。
比如说:求【1,2】的子集。
1. 先求【1】的子集【1】
2. 再求【2】的子集【2】
3. 把子集”加”起来 [a+b for a in l1 for b in l2]+l1+l2
1. 最后再加上空集
整体代码如下:
class Solution(object):
def subsets(self, nums):
nums.sort()
return self.helper(nums)+[[]]
def helper(self,nums):
n=len(nums)
if n==1:return [nums]
n//=2
l1=self.helper(nums[:n])
l2=self.helper(nums[n:])
return [a+b for a in l1 for b in l2]+l1+l2
那不递归,采用迭代的方式呢?
【1,2,3,4】
假设我们已经有了【1,2】的子集ans=【【1】【2】【1,2】】
那再加上一个元素【3】
则子集由三部分组成:
1. 【1】【2】【1,2】原来的那部分
1. 【3】单3
1. 原来那部分,每个再加一个元素【3】,即【1,3】【2,3】【1,2,3】
所以整理的代码如下:
class Solution(object):
def subsets(self, nums):
nums.sort()
ans=[]
for i in nums:
ret=[j+[i] for j in ans]
ans+=ret+[[i]]
return ans+[[]]
discuss之中大神多,看别人怎么做的也是一种启发:
def subsets(self, nums):
res = [[]]
for num in sorted(nums):
res += [item+[num] for item in res]
return res
短短几行,言简意赅。
主要思想和第二种方法是一致的,但是简单很多。
在78题的基础之上,再做90题就简单很多,我们只需要保证,没有重复的就可以了:
我在最后一个代码上,稍作修改即有:
class Solution(object):
def subsetsWithDup(self, nums):
res = [[]]
for num in sorted(nums):
res += [item + [num] for item in res if item + [num] not in res]
return res