LeetCode90-子集II

最近推荐一位日本女明星——石原里美

封面就是其本人

有颜有才

笑起来真的很好看了

希望大家能与我一起欣赏她的美

啊哈哈哈哈哈哈哈哈

补一句:我不是超级无敌屌丝猥琐男哈!!!


给定一个可能包含重复元素的整数数组 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%左右。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习的学习者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值