题目:给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。

输入:[1,2,2]   输出:[[2],[1],[1,2,2],[2,2],[1,2],[]]

来源:https://leetcode-cn.com/problems/subsets-ii/

法一:自己的代码   时间超过百分之98

思路:通过画图观察出剪枝条件,如果上一个是一个节点与上一个数值相等,且上一个是入栈,下一个是出栈,则需要剪掉,排序后先对相同的数字进行判断可以节省更多的时间.

from typing import List
from collections import Counter
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
results = []
l = len(nums)
# 法一
# 将数字按出现频率由高到低排序,目的是提前剪枝来减少剪枝的次数,
# nums = [item for items, c in Counter(nums).most_common() for item in [items] * c]
# 这样时间会更短些,如果没有重复元素直接排序,如果有在按频率排序
# 法二
if l == len(set(nums)):
nums.sort()
else:
nums = [item for items, c in Counter(nums).most_common() for item in [items] * c]
def backtrack(a=[], nums=nums,count=0,sign=0):
if count == l:
results.append(a[:])
print(results)
return
for i in [nums[count]]:
count += 1
# 通过画图可以观察出,当两个数相同时,如果上一个节点是入栈,下一个节点是出栈,则该枝必须剪掉,
# 这个剪枝条件等价于如果上一个节点是出栈,下一个是入栈,二者是充要条件,
# sign用于标记是出栈还是入栈 # if条件用于判别是否执行剪枝
if (count>1) & (nums[count-1] == nums[count-2]) & (sign==0):
a.append(i)
sign = 0
backtrack(a,count=count,sign=sign)
# 以后关于栈的问题,压栈后务必要记得出栈,否则很容易出错
a.pop()
# 后面的不执行的即剪掉的枝
else:
a.append(i)
sign = 0
backtrack(a,count=count,sign=sign)
a.pop()
sign = 1
backtrack(a,count=count,sign=sign)
backtrack()
return results
if __name__ == '__main__':
duixiang = Solution()
a = duixiang.subsetsWithDup([1, 2,1, 2])
print(a)

90子集II的更多相关文章

  1. 90. 子集 II

    90. 子集 II 题意 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2]输出:[ [2], [1], ...

  2. Leetcode之回溯法专题-90. 子集 II(Subsets II)

    Leetcode之回溯法专题-90. 子集 II(Subsets II) 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入 ...

  3. Java实现 LeetCode 90 子集 II(二)

    90. 子集 II 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [ ...

  4. [leetcode] 90. 子集 II.md

    90. 子集 II 78. 子集题的扩展,其中的元素可能会出现重复了 我们仍沿用78题的代码,稍作改动即可: 此时需要对nums先排个序,方便我们后面跳过选取相同的子集. 跳过选取相同的子集.当选取完 ...

  5. leetcode刷题-90子集 II

    题目 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2]输出:[ [2], [1], [1,2,2], [ ...

  6. leetcode 90. 子集 II JAVA

    题目: 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2] ...

  7. Leetcode 90. 子集 II

    地址  https://leetcode-cn.com/problems/subsets-ii/ 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重 ...

  8. LeetCode 90. 子集 II(Subsets II)

    题目描述 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2 ...

  9. 力扣90——子集 II

    原题 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2], ...

随机推荐

  1. deepin下挂载的的Windows系统(NTFC)目录怎么是只读的???

    关键命令: df-h sudo ntfsfix /dev/sda4 重启 参考博客:深度官网问题之大神回复

  2. Mac OSX编译安装php7.1.8

    laravel中用到ldap认证包,要求php7.0以上版本,而且安装Mews\Captcha包的时候 验证码无法显示 报错如下: Call to undefined function Interve ...

  3. Tree HDU - 6547 (树链剖分,线段树)

    wls 有三棵树,树上每个节点都有一个值 ai,现在有 2 种操作: 将一条链上的所有节点的值开根号向下取整: 求一条链上值的和: 链的定义是两点之间的最短路. Input 第一行两个数 n, q 分 ...

  4. [HDU 3521] [最小割] Being a Hero

    题意: 在一个有向图中,有n个点,m条边$n \le 1000 \And \And  m \le 100000$ 每条边有一个破坏的花费,有些点可以被选择并获得对应的金币. 假设一个可以选的点是$x$ ...

  5. 双向BFS统计

    Hdu1195 两个四位密码 问你最少多少步能到达 /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof ...

  6. keystonejs实战之页头页脚

    前两篇介绍了入门相关知识及对keystonejs整体可用性评估,这篇介绍下开始实际运用中的页头页脚部分,因为马上项目忙了,这个先匆匆的作个收尾. 不管是用WordPress还是其他CMS系统,应用最宽 ...

  7. Github首次使用,上传代码

    参考博客:https://blog.csdn.net/zhangsiyao11/article/details/77007684 1.首先下载客户端github下载地址为 https://github ...

  8. K8S网络模型

    一.网络模型概述 k8s的网络中主要存在四种类型的通信:同一pod内的容器间通信.各pod彼此之间的通信.pod与service间的通信.以及集群外部的流量同service之间的通信. k8s为pod ...

  9. 随机验证码生成和join 字符串

    函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符) ...

  10. 51nod 1402 最大值(贪心)

    原题链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1402 思路:借鉴了这篇博文http://blog.csdn.n ...