回溯算法:排列问题II,去重方法全归纳!

本文介绍了回溯算法在解决排列问题II时的去重方法,包括不同类型的去重策略:组合问题中相邻元素的去重、递增子序列的set去重、排列问题I的全局vector去重以及排列问题II中更复杂的去重策略,重点讨论了如何避免在相同元素存在时产生重复排列。
摘要由CSDN通过智能技术生成

回溯算法:排列问题II

在这里插入图片描述
思路,这道题也是需要去重,但和之前的去重又有些不同,对去重进行一下整理:

一般来说:组合问题和排列问题是在树形结构的叶子节点上收集结果,而子集问题就是取树上所有节点的结果

1.组合数问题:i > startIndex && nums[i] == nums[i - 1] 这是对同一树层的相邻且相同的元素进行去重,比如【1,2 ,3, 3,3,4】,对于一树枝上的相同元素无需去重
2. 递增子序列:利比上面稍微复杂,相同元素并没有相邻了,因此借用set进行去重,uset.find(nums[i]) != uset.end(),这是对同一层相同的元素进行去重,比如【1,2,3,1,1,1】,注意:set定义的是局部变量,用来控制每一层的循环
3. 排列问题I:借用全局的vector去重,这次的去重是对同一树枝进行去重,即上一层使用过的节点这一层不能使用,比如【1,2,3】,那么【1】的下一层子树就只能有【2,3】
4. 排列问题II:比排列问题稍微复杂,加入了相同元素,如果只考虑同一树枝去重的话势必会出现相同的排列方法,比如【1,1,2】以第一个【1】为首的排列,和以第二个【1】为首的排列就会出现重复元素。因此还要控制同一树层元素去重并且去重的是要未被使用过的数字!,举个例子:第一层:【1】,第二层:【1(树枝去重),1,2】,不能把第二层第二个【1】去重删去了
5. 详细见代码:

class Solution {
   
public:
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值