子集和问题 算法_LeetCode刷题实战90:子集 II

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 子集 II,我们先来看题面:

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

Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

题意

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

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

解题

https://www.cnblogs.com/techflow/p/13489811.html

题解

全排列的问题也好,获取子集也好,这些问题都已经算是老生常谈了,我们之前做过不少。这些问题经过转化之后,本质上还是搜索问题。我们在样本空间当中搜索所有合法的解,存储起来。这道题的前身LeetCode78题用的正解也是搜索的解法,对于使用搜索算法来解这道题问题不大,但问题是针对数组当中的重复元素我们应该怎么样来处理。最简单也是最容易想到的方法当然是先把所有的子集全部找到之后,我们再进行去重。如果采用这样的方法,还有一个便利是我们可以不用递归,而是可以通过二进制枚举的方法获取所有的子集。但也有一个问题,问题就是复杂度。我们把集合当中的每一个数字都看成是独立的,那么对于每一个数字来说都有取和不取两种方案。对于n个数字来说,方案总数当然就是。并且我们还需要对这个集合进行去重,这带来的开销可想而知。当然针对这个问题我们也有解决方案比如可以用hash算法将一个集合hash成一个数,如果hash值一样说明集合的构成相同。这样我们就可以通过对数字去重来实现集合去重了。但这样仍然不是完美的,首先hash算法也不是百分百可靠的,也可能会出现hash值碰撞的情况。其次,这种方案的实现复杂度也很大,我们找出所有集合之后再通过hash算法进行过滤,整个过程非常麻烦。很明显,这题一定还存在更好的方法。既然事后找补不靠谱,那么我们可以试着事前避免。也就是说我们在搜索所有子集的时候就设计一种机制可以过滤掉重复的集合或者是保证重复的集合不会出现。我们可以分析一下重复的集合出现的原因,两个集合完全一样,说明其中的元素构成完全一致。元素的构成一致又有两种可能,第一种是重复的获取,比如[1, 3],我们先拿1再拿3和先拿3再拿1本质上是一样的。还有一种可能是元素的重复导致的集合重复,比如[1, 3]假如我们候选的1不止一个,那么拿不同的1也会被认为是不同的方案。针对第一种情况出现的重复非常简单,我们可以对元素进行排序,之后限定拿取元素的顺序。只能从左拿到右,不能先拿右边的元素再回头拿左边的元素,这样就禁止了第一种情况导致的重复。这个方法我们曾经在很多问题当中用到过,就不详细介绍了。下面来说说第二种情况,就是重复元素导致的重复集合。这一点需要结合代码来仔细说明,我们来看一段经典的搜索代码:

def dfs(cur, subset):    for i in range(cur, n):
        nxt = subset + [nums[i]]
        ret.append(nxt)
        dfs(i+1, nxt)

这一段是一个经典的搜索代码,我们在for循环当中执行的其实是一个枚举操作,也就是枚举这一轮我们要拿取哪一个元素。这里我们限制了选择的范围只能在上一次选择元素的右侧,也就是上文当中说的针对第一种情况的方案。假设我们当前候选的元素是[1, 1, 3, 3],这里虽然有4个元素,但是值得我们搜索的其实只有两个,就是1和3。因为第二个1和第二个3都没有任何用处,只会导致结果重复。并且假设我们希望得到[1, 1]这样的结果,只能通过拿取左侧的1实现。也就是说如果出现重复的元素,我们只需要考虑第一个出现的,其余都没有考虑的必要。为了更加形象, 我们画出这一段的搜索树。这里我们为了简化图示,只画了[1, 1, 3]三个数的情况。可以看出我们选第一个1和第二个1,都构建出了[1, 3]这个集合,这是重复的。并且我们可以发现第二个1的所有情况第一个1都已经包括了,所以这一整个分支都是多余的,可以剪掉。
61d32c38a3f0511aa54bcedaf9f122ca.png
最后,我们把上面的细节全部串起来写出代码:

class Solution:def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:# 对元素排序,将重复的元素挨在一起
        nums = sorted(nums)
        ret = [[]]
        n = len(nums)def dfs(cur, subset):    # 上一次选择的元素,一开始置为None
            last = Nonefor i in range(cur, n):if i == cur or nums[i] != last:# 存储集合
                    nxt = subset + [nums[i]]
                    ret.append(nxt)# 更新last
                    last = nums[i]
                    dfs(i+1, nxt)
        dfs(0, [])return ret

到这里,我们关于这道题的介绍就结束了。从代码上来看,这道题的代码不长,涉及到需要推理的细节也并不多,总体的难度并不大。但作为一道搜索问题,它仍然非常有价值。如果你能自己思考推导得出正确的递归代码,那么说明你对递归的理解已经可以算是合格了,所以这题也非常适合面试,要准备找工作的小伙伴,可以仔细刷刷。好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力。

上期推文:

LeetCode50-80题汇总,速度收藏!LeetCode刷题实战81:搜索旋转排序数组 IILeetCode刷题实战82:删除排序链表中的重复元素 IILeetCode刷题实战83:删除排序链表中的重复元素LeetCode刷题实战84: 柱状图中最大的矩形LeetCode刷题实战85:最大矩形LeetCode刷题实战86:分隔链表LeetCode刷题实战87:扰乱字符串LeetCode刷题实战88:合并两个有序数组LeetCode刷题实战89:格雷编码

e81dbd51be32898b77128f0bf10bf262.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

隐私计算 2.5 Blakley秘密共享方案

1 简介 作者:Blakley;时间:1979年;理念:基于高斯消元法。 2 具体实现 I 秘密分割算法 II 秘密重构算法 3 实例 设秘密S(3,10,5)S (3, 10, 5)S(3,10,5),n5n 5n5, t3t 3t3。 I 秘密分割 &#xff0…

webconfig的解决方案怎么添加_解决在Web.config或App.config中添加自定义配置的方法详解...

解决在Web.config或App.config中添加自定义配置的方法详解本篇文章是对在Web.config或App.config中添加自定义配置的方法进行了详细的分析介绍,需要的朋友参考下.Net中的System.Configuration命名空间为我们在web.config或者app.config中自定义配置提供了完美的支持…

conda如何升级pytorch_Google Cloud TPUs 支持 Pytorch 框架啦!

在2019年PyTorch开发者大会上,Facebook,Google和Salesforce Research联合宣布启动PyTorch-TPU项目。项目的目标是在保持PyTorch的灵活性的同时让社区尽可能容易地利用云TPU提供的高性能计算。团队创建了PyTorch/XLA这个repo,它可以让使PyTorc…

隐私计算 2.6 秘密共享的同态特性

1 秘密共享的同态性 秘密共享的同态性:秘密份额的组合等价于组合的秘密共享份额。 假设A、B两方分别有秘密SAS^ASA和SBS^BSB;他们的值被随机拆分为S1A,…,SnAS_1^A, \dots, S_n^AS1A​,…,SnA​和S1B,…,SnBS_1^B, \dots, S_n^BS1B​,…,SnB​&#xff…

chromiumwebbrowser 使用_用Tchromium替换webbrowser

用惯了EmbeddedWB,不想换,但是IE内核一直存在内存泄漏问题,没办法,只有寻找替代品了。要把用习惯的EmbeddedWB换成完全不一样的TChromium,有点挑战,特别是在资料不多,英语没过三级的情况下。未来趋势是这样…

python是在linux系统下运行的吗_Linux系统下python代码运行shell命令的方法

方法一:os.popen #!/usr/bin/python#-*- coding: UTF-8 -*- importos, sys#使用 mkdir 命令 a lsb os.popen(a,w,1)print b 方法二:os.system #!/usr/bin/python#-*- coding: UTF-8 -*- importos, sys arg0"121.429015"arg1"31.245255&q…

隐私计算 2.7 Shamir门限秘密共享的加法同态性

1 Shamir门限秘密共享的加法同态性 Shamir门限秘密共享方案具有(,)(, )(,)同态的性质,即: SASBFI(S1A,…,StA)FI(S1B,…,StB)FI(S1AS1B,…,StAStB)\begin{array}{l} S^A S^B && F_I(S_1^A, \dots, S_t^A) F_I(S_1^B, \dots, S_t^B)\\ &&a…

pageable设置size_分页工具一Pageable与Page

import org.springframework.data.domain.Pageable;import org.springframework.data.domain.Page;1.Pageable概述Page findByAge(int age, Pageable pageable);Pageable 是Spring Data库中定义的一个接口,用于构造翻页查询,是所有分页相关信息的一个抽象…

二阶龙格库塔公式推导_带你走进最美数学公式

同学们,我们先来跟老师欣赏一下数学中最优美的式子吧?是什么魔力让以上几个似乎毫不相干的数学中最特殊的数字能如此优美的写在同一个式子呢?是欧拉,是数学。0和1——老师就不用介绍啦,e是自然常数(natural constant)&…

python如何做辅助线_角平分线如何做辅助线,学霸总结了4种模型,轻松应付中考...

角平分线2大辅助线思路4种基本模型对称形思路包括3种基本模型,思想都是为了构造全等三角形,然后转换图像中的角度和线段关系。平行线思路则是为了构造一个等腰三角形,通常是为了转移线段关系。双角平分线夹角公式记住这个结论,在选…

隐私计算 2.8 Shamir门限秘密共享的乘法同态性

1 Shamir门限秘密共享的乘法同态性 Shamir门限秘密共享方案具有(,)(\times, \times)(,)同态的性质,即: SASBFI(S1A,…,StA)FI(S1B,…,StB)FI(S1A⊗S1B,…,StA⊗StB)\begin{array}{l} S^A \times S^B && F_I(S_1^A, \dots, S_t^A) \times F_I(S_…

备份数据库的expdp语句_【ORACLE语句备份】数据库表同步 ——定时任务管理器(EXPDP导出,IMPDP导入)...

1、C:\Users\Administrator>sqlplus sys/xxxxxx as sysdba;2、SQL> create directory dbbak4 as e:\app\temp4;3、SQL> grant read,write on directory dbbak4 to xxx;--xxx:源数据库用户名4、SQL> exit;5、备注:还需手动创建目录,否则报错C…

python的setting怎么找_django项目的配置文件settings.py详解

1.2.1 ABSOLUTE_URL_OVERRIDES:默认值:{} 一个字典映射“app_label_module_name”字符串到一个函数,该函数接收一个Model对象作为参数并返回它的url,这是一个安装上覆盖get_absolute_url()方法的方式 1.2.2 ADMIN_FOR:默认值&…

隐私计算 2.9 秘密共享应用于横向联邦学习

1 简介 1.1 横向联邦学习 横向联邦学习也称为按样本划分的联邦学习,主要应用于各个参与方的数据集有相同的特征空间和不同的样本空间的场景,例如两个地区的城市商业银行可能在各自的地区拥有非常不同的客户群体,所以他们的客户交集非常小&a…

array js 二分法_JS常见的算法

虽说我们很多时候前端很少有机会接触到算法。大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一方面。实际上学习数据结构与算法对于工程师去理解和分析问题都是有帮助的。如果将来当我们面对较为复杂的问题,这些基础知识的积累…

python缩进说法_【多选题】关于Python程序中与“缩进”有关的说法中,以下选项中错误的是()。...

问题:【多选题】关于Python程序中与“缩进”有关的说法中,以下选项中错误的是()。更多相关问题 因方某将赵某打伤,方某住所地的市劳动教养委员会对方某作出劳动教养2年的决定,并将方某送交劳动 根据行政诉讼…

智能测井解释

1 智能测井解释的需求分析 1、岩性识别 2、储层划分 3、参数计算 4、流体判别 5、井数据批量处理 岩性识别:分类任务 曲线预测、曲线补齐:回归任务 2 岩性识别 2.1 岩性识别主要方法简介 目前岩性识别的方法主要有重磁、测井、地震、遥感、电 磁、地…

wpf 点击按钮弹出选择框_关于WPF的弹出窗口

几个重要的概念需要清楚:Show和ShowDialog区别1、调用Show方法后弹出子窗口后,线程会继续往下执行。调用ShowDialog方法弹出子窗口后,线程会阻塞,直到子窗口关闭才继续往下执行。2、ShowDialog弹出的子窗口会使父窗口不能获得焦点…

基于移动设备的OCR识别工作进展(1)

1 模型调研 模型1:Tesseract-OCR 模型2:PaddleOCR Android上面有体验版的demo:https://ai.baidu.com/easyedge/app/openSource?frompaddlelitePP-OCR模型:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/README_…

2020.2idea创建web_IntelliJ IDEA 2017.3 完整的配置Tomcat运行web项目教程(多图)

小白一枚,借鉴了好多人的博客,然后自己总结了一些图,尽量的详细。在配置的过程中,有许多疑问。如果读者看到后能给我解答的,请留言。Idea请各位自己安装好,还需要安装Maven和Tomcat,各自配置好环…