90子集II
题目:给定一个可能包含重复元素的整数数组 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的更多相关文章
- 90. 子集 II
90. 子集 II 题意 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2]输出:[ [2], [1], ...
- Leetcode之回溯法专题-90. 子集 II(Subsets II)
Leetcode之回溯法专题-90. 子集 II(Subsets II) 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入 ...
- Java实现 LeetCode 90 子集 II(二)
90. 子集 II 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [ ...
- [leetcode] 90. 子集 II.md
90. 子集 II 78. 子集题的扩展,其中的元素可能会出现重复了 我们仍沿用78题的代码,稍作改动即可: 此时需要对nums先排个序,方便我们后面跳过选取相同的子集. 跳过选取相同的子集.当选取完 ...
- leetcode刷题-90子集 II
题目 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2]输出:[ [2], [1], [1,2,2], [ ...
- leetcode 90. 子集 II JAVA
题目: 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2] ...
- Leetcode 90. 子集 II
地址 https://leetcode-cn.com/problems/subsets-ii/ 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重 ...
- LeetCode 90. 子集 II(Subsets II)
题目描述 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2 ...
- 力扣90——子集 II
原题 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2], ...
随机推荐
- 多线程 - 线程通信 suspend-resume wait-notify park-unpark 伪唤醒
线程通信(如 线程执行先后顺序,获取某个线程执行的结果等)有多种方式: 文件共享 线程1 --写入--> 文件 < --读取-- 线程2 网络共享 变量共享 线程1 --写入--> ...
- PAT Basic 1020 月饼 (25 分)
月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是多少. 注意:销售时允许取出一部分库存.样 ...
- SQL练习02
编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+| Id | Salary |+----+--------+| 1 | 100 || ...
- C语言的函数声明,定义,调用以及exit退出
#include <stdio.h> #include <stdlib.h> void singing(); int main() { singing(); system(&q ...
- grunt-contrib-concat 合并任意文件
grunt-contrib-concat可用于合并任意文件(css\js\txt等) 安装插件:npm install grunt-contrib-concat --save-dev 参数: sepa ...
- @RequestParam和@PathVariable用法小结
@RequestParam 使用@RequestParam接收前段参数比较方便,前端传参的URL: url = “${ctx}/main/mm/am/edit?Id=${Id}&name=${ ...
- 3.决策树ID3算法原理
1.决策树的作用 主要用于解决分类问题的一种算法 2.建立决策树的3中常用算法 1).ID3--->信息增益 2).c4.5--> 信息增益率 4).CART Gini系数 3.提出问题: ...
- ZooKeeper 简介说明
1.什么是Zookeeper? Zookeeper是一个高效的分布式协调服务,它暴露了一些公用服务,比如命名/配置管理/同步控制/群组服务等.我们可以使用Zookeeper来实现比如达成共识/集群管理 ...
- wkhtmltopdfhtml php生成pdf快照,网页截图,网页快照完整版 (原)
首先,安装(linux安装为例) 1.下载wkhtmltopdf wget http://download.gna.org/wkhtmltopdf/obsolete/linux/wkhtmltopdf ...
- JavaWeb_使用dom4j解析、生成XML文件
dom4j 官网 xml解析DOM文档对象模型(树形结构) DOM方式解析:把xml文档加载到内存形成树形结构,可以进行增删改的操作 Learn 使用dom4j解析文件"NewFile. ...