【算法】全排序I,全排序II-回溯算法中的树枝去重和树层去重理解

简介: 【算法】全排序I,全排序II-回溯算法中的树枝去重和树层去重理解

文章目录

先分析一下这道题目的区别,

首先46题题中要求是不含重复元素,所以我们在进行回溯的时候不需要对数据进行去重、

其次47题题中说明了含有重复元素,所以我们在进行回溯过程中需要对数据进行去重。那么我们怎么去重呢?

42682eb05cda40c29be66dca07241cbf.png05b00eec4cb44694b612de150e64ca8b.png

上面两道题我们使用传统的回溯写法很容易就可以写出来,但是对于47题难点是对数据进行去重,这里我们需要解释一下卡子哥自创的树枝去重和树层去重

我们用树化的思维去寻找符合条件的值,存在多个同一个数的时候,在同一个树枝上可以重复,对于同一层来说,如果再取这个数据就会出现重复,一般用一个used数据来表示,不太理解的话可以先记住,多做几道题就理解了。(我大概遇到五六道题就慢慢理解了)。


树层去重:

if(i>0 && num[i] == nums[i-1] && used[i-1] == false)


树枝去重:

if(i>0 && num[i] == nums[i-1] && used[i-1] == true)


这里我给出两道题的示例代码,仔细品一品吧。

全排序I

class Solution {
    List<List<Integer>>  list  = new ArrayList<>();
    LinkedList<Integer> list1 = new  LinkedList<>();
    boolean[] used;
    public List<List<Integer>> permute(int[] nums) {
        if(nums.length == 0){
            list.add(new ArrayList<>(list1));
            return list;
        }
        used = new boolean[nums.length];
        HiSir(nums);
        return list;
    }
    public void HiSir(int[] nums){
        if(list1.size() == nums.length){
            list.add(new ArrayList<>(list1));
            return;
        }
        for(int i = 0;i<nums.length;i++){
            if(used[i]){
                continue;
            }
            used[i] = true;
            list1.add(nums[i]);
            HiSir(nums);
            used[i] = false;
            list1.removeLast();
        }
    }
}


全排序II

class Solution {
    List<List<Integer>> list = new ArrayList<>();
    LinkedList<Integer> list1 = new LinkedList<>();
    boolean[] used;
    public List<List<Integer>> permuteUnique(int[] nums) {
        if(nums.length == 0){
            list.add(new ArrayList<>(list1));
            return list;
        }
        used = new boolean[nums.length];
        Arrays.fill(used,false);
        Arrays.sort(nums);
        HiSir(nums);
        return list;
    }
    public void HiSir(int[] nums){
        if(list1.size() == nums.length){
            list.add(new ArrayList<>(list1));
            return;
        }
        for(int i =0;i<nums.length;i++){
            if(i >0 && nums[i] == nums[i-1] && used[i-1] == false){
                continue;
            }
            if(used[i] == false){
                used[i] = true;
                list1.add(nums[i]);
                HiSir(nums);
                list1.removeLast();
                used[i] = false;
        }
    }
}
}


相关文章
|
18天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
10天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
51 8
|
10天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
41 7
|
10天前
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
19 2
|
19天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
19天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
19天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
19天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
19天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
19天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之顺序表习题精讲【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找习题精讲等具体详解步骤以及举例说明