力扣:47. 全排列 II

回溯解法思路:

1.先写一个集合来接收全部的全排列,再写一个集合来接受单个的全排列。在声明一个int【】数组来用于去重用的标记nums数组中什么元素用了的标记。同时排列一下nums数组方便去除重复的全排列。

2.调用回溯函数,终止条件为li2集合的长度等于nums.length,相当于遍历到了结尾,同时要注意相同的数字造成的重复的全排列,所以要去重。在遍历过程中假如Index【i】值为0就表示没有使用该nums【i】的值,使用的nums【i】值的Index【i】值为1。之后进行递归和回溯操作来遍历全部的全排列。

class Solution {
    //接收全部的全排列
    List<List<Integer>> li1=new ArrayList<>();
    //接收单个全排列
    List<Integer> li2=new ArrayList<>();
    public List<List<Integer>> permuteUnique(int[] nums) {
        //用于去重用的标记nums数组中什么元素用了的标记
        int[] Index=new int[nums.length];
        //排列一下nums数组方便去除重复的全排列
        Arrays.sort(nums);
        //调用回溯函数
        huisu(nums,Index);
        return li1;
    }
    //回溯函数
    public void huisu(int[] nums,int[] Index){
        //终止条件
        if(li2.size()==nums.length){
            li1.add(new ArrayList<>(li2));
            return ;
        }
        //遍历全部的全排列
        for(int i=0;i<nums.length;i++){
            //去重相同的数字造成的重复的全排列
            if(i>0&&nums[i]==nums[i-1] && Index[i-1]==0){
                continue;
            }
        //假如Index【i】没有用,就进行向下寻找全排列
            if(Index[i]==0){
                //同时要把Index【i】标记为已使用
                Index[i]=1;
                //把元素添加到集合li2中
                li2.add(nums[i]);
                //递归继续寻找
                huisu(nums,Index);
                //回溯节点,寻找其他节点
                Index[i]=0;
                li2.removeLast();
            }
        }
    }
}

相关推荐

  1. 47. 排列 II

    2024-02-08 10:04:01       34 阅读
  2. 46. 排列

    2024-02-08 10:04:01       33 阅读
  3. 47. 排列 II

    2024-02-08 10:04:01       38 阅读
  4. 46---排列(递归)

    2024-02-08 10:04:01       19 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-08 10:04:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-08 10:04:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-08 10:04:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-08 10:04:01       18 阅读

热门阅读

  1. Vue 3 + Koa2 + MySQL 开发和上线部署个人网站

    2024-02-08 10:04:01       35 阅读
  2. ASP.NET Core MVC 控制查询数据表后在视图显示

    2024-02-08 10:04:01       35 阅读
  3. 【Docker】01 Docker安装与配置

    2024-02-08 10:04:01       31 阅读
  4. LLVM实战之LLVM bitcode转换成目标平台汇编码

    2024-02-08 10:04:01       38 阅读
  5. 装饰器模式

    2024-02-08 10:04:01       29 阅读
  6. Vue中的自定义参数校验

    2024-02-08 10:04:01       29 阅读
  7. QT C++ 中常见知识点

    2024-02-08 10:04:01       21 阅读
  8. 将数据列表转为树型

    2024-02-08 10:04:01       23 阅读
  9. FPS游戏框架漫谈第二十二天

    2024-02-08 10:04:01       26 阅读
  10. 代码随想录二刷——二叉树day15

    2024-02-08 10:04:01       26 阅读