【LeetCode-中等题】47. 全排列 II

文章目录

组合+并集问题汇总:

1、子集去重版本
2、组合非去重版本
3、子集非去重版本

题目

相比较46题:不需要去重:【LeetCode-中等题】46. 全排列

需要做出的改变就是:

  1. 首先需要对待全排列的数组进行排序(为去重操作做准备)
java 复制代码
 Arrays.sort(nums);//对数组进行排序   方便后续进行去重操作
  1. 在每次进行递归的时候,不仅需要判断标志数组是否为true(跳过此次),还要在i>0的,并且后一个位置的元素如果和前面一个元素相同,并且标志位为false(代表未处理),那么也跳过此次递归,

  2. 最后同样是递归和回溯(和不去重的代码一样)

    参考视频讲解:回溯算法求解全排列,如何去重?| LeetCode:47.全排列 II

    图解全排列无去重版本:【LeetCode-中等题】46. 全排列 ---无去重

方法一:递归+回溯+去重

java 复制代码
class Solution {
    List<List<Integer>> res = new ArrayList<>();//最后的结果集
    public List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums);//对数组进行排序   方便后续进行去重操作
      List<Integer> path = new ArrayList<>(); //子结果集
      boolean[] usered = new boolean[nums.length]; //标记数组

      backtrace(nums,path,usered);

      return res;
    }

    public void backtrace(int[] nums ,List<Integer> path ,boolean[] usered){
      if(path.size() == nums.length) {//递归出口(子结果集大小 = 数组大小 )
        res.add(new ArrayList<>(path));//因为path是实时变化的,必须要将path复制到一个新数组再放到res结果集
        return;
      }
      for(int i = 0 ; i < nums.length ; i++){
        
        // if(usered[i]) continue;//如果标志位为true  则直接跳过
        // if(i > 0 && nums[i] == nums[i - 1] && !usered[i - 1]) continue;

        if(usered[i] || (i > 0 && nums[i] == nums[i - 1] && !usered[i - 1])) continue;//去重操作
        else {
          path.add(nums[i]);//加入子结果集
          usered[i] = true;//将该位置标志位标为true  往下不能取了
          backtrace(nums,path,usered);//往下面继续递归
          usered[i] = false;//某次递归结束后,要回溯回去,就得把之前该的标志位还原
          path.remove(path.size()-1);//某次递归结束后,要回溯回去,当前path应该把递归之前加的元素给剔除掉
        }
      }

    }
}
相关推荐
海清河晏1112 小时前
数据结构 | 单循环链表
数据结构·算法·链表
wuweijianlove6 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong6 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志6 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
黎阳之光7 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_117 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia7 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg7 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒8 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾8 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio