部分内容参考此文章 :LeetCode解题之Subsets
78.子集
题目:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
解答
在网上查到了下面这个答案,作者思路很清晰,写的代码也好看
LeetCode解题之Subsets
大概的思路就是,把数字按升序排列,然后依次将后面的数字与前面已有的子集进行组合,直至结束。
该作者的代码如下:
class Solution(object):
def subsets(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result = [[]] # 初始为空集
for num in sorted(nums):
result += [item + [num] for item in result]
"""
第一步得到[[], [1]] 把1和空集进行拼接得到[1]
第二步得到[[], [1], [2], [1, 2]] 把2和[]、[1]进行拼接
第三步得到[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]] 把3和第二步结果进行拼接
"""
return result
if __name__ == "__main__":
assert Solution().subsets([1, 2, 3]) == [[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
把列表解析式展开,写成for
循环,也就是:
nums = [1,2,3]
result = [[]]
for num in sorted(nums):
res_new = []
for item in result:
res_new.append(item + [num])
result += res_new
print(result)
90.子集 II
题目:给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
思路
子集 II 和子集的区别是,子集 II 多了重复元素,如果按照 子集 的方法来做,就会出现重复子集
- [[], [1]]
- [[], [1], [2], [1, 2]]
- [[], [1], [2], [1, 2], [2], [1, 2], [2, 2], [1, 2, 2]]
因此,需要做一个子集的筛选,不再将重复元素放入结果列表中
解答
class Solution(object):
def subsetsWithDup(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
result = [[]]
for num in sorted(nums):
res_new = []
for item in result:
res = item + [num]
if res not in result: # 在此处做筛选,若result中没有该子集,则放入result中
res_new.append(res)
result += res_new
return result