最近推荐一位日本女明星——石原里美
封面就是其本人
有颜有才
笑起来真的很好看了
希望大家能与我一起欣赏她的美
啊哈哈哈哈哈哈哈哈
补一句:我不是超级无敌屌丝猥琐男哈!!!
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
思路:
这一题是第78题子集的进阶版,但主体方法都是使用回溯法的,对第78题子集的朋友可以先看看我写的那篇文章。
https://blog.csdn.net/weixin_36431280/article/details/88086945
本题与第78题的区别就是:给定的整数数组nums中可能包含重复元素,所以这个需要我们去重。为了偷懒,我就是直接在第78题的基础上对combine_list.append(current_list)加上了一个限制条件,即:if current_list not in combine_set:
但是本题仍然有个陷阱,可以先看下图:
至此大功告成!
代码如下:
class Solution(object):
def subsetsWithDup(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
# 首先将nums数组排序,方便后续去重
nums.sort()
# 定义保存所有子集的集合
combine_set = []
# 核心的递归算法
def back(start=0, current_list=[]):
"""
:start: 每次递归时的起点值
:current_list: 保存临时子集的集合
"""
if current_list not in combine_set:
combine_set.append(current_list)
for index in range(start, len(nums)):
back(index+1, current_list+[nums[index]])
back()
return combine_set
if __name__ == "__main__":
nums = [4,4,4,1,4]
combine_set = Solution().subsetsWithDup(nums)
print(combine_set)
执行效率算是一般,在40%左右。