DFS算法系列题 全排列II

DFS算法系列题 – 全排列II

DFS精选题- > 这次我们挑战的对象是:

全排列II

题目链接:47. 全排列 II - 力扣(LeetCode)

这道题和我们之前做的全排列不同的点在于这道题的题目包含了重复的数字,要求我们返回不重复的全排列:

在这里插入图片描述

对此,我们需要引入一个算法策略来帮助我们解决重复数字的问题,那就是剪枝

剪枝:其实就是通过特定的条件将我们不需要的搜索路径去掉,从而提高我们的代码运行效率,这就类似于剪掉搜索树中无用的枝条

那么,上述这道题的需要满足的剪枝条件又是什么呢?

在于以下两点:

  • 同一个节点的所有的分支中,相同的数只能出现一次
  • 同一个元素只能出现一次

通过上述条件,我们可以画出对应的决策树来观察情况:

在这里插入图片描述

通过对上述决策树的分析,我们需要创建一些特殊的变量来满足我们的需求:

  • boolean[] check : 用来检测当前元素是否在之前层已经被使用过了
  • List<Integer> path : 用来记录路径
  • 我们通过int[] nums数组来存储元素,并且若当前层nums[i] == nums[i - 1] ,则可通过check[i - 1] == true来判断当前数字是否是当前层第一个使用的重复数字,若上一层使用了重复数字元素i - 1, 则check[i - 1] == true,此时当前层则未有对该重复数字的使用,在当前层就能使用重复数字i了
  • 到了新的一层会重新开始判断第一个重复的数字
  • 在进行上述重复数字判断前,我们需要将传递进来的数值列表进行排序,使得出现的重复数字前后挨在一起,方便使用i, i - 1判断

分析完后,接下来我们开始编写代码!

代码示例

class Solution {
    
    List<List<Integer>> ret;
    boolean[] check;
    
    public List<List<Integer>> permuteUnique(int[] nums) {
        ret = new ArrayList<>();
        check = new boolean[nums.length];
        Arrays.sort(nums); // 这里记得将数组按顺序排列
        dfs(nums, new ArrayList<>());
        return ret;
    }

    public void dfs(int[] nums, List<Integer> path) {

        if (path.size() == nums.length) {
            ret.add(new ArrayList<>(path));
            return;
        }

        for (int i = 0;i < nums.length;i++) {
            if (!check[i] && (i == 0 || nums[i] != nums[i - 1] || check[i - 1] == true)) {
             // 这里有个隐藏的条件,当nums[i] != nums[i-1] 时,由于是或判断,则能进行到check[i - 1] == true 判断则代表着num[i] == nums[i - 1]了
                path.add(nums[i]);
                check[i] = true;
                dfs(nums, path);
                path.remove(path.size() - 1);
                check[i] = false;
            }
        }
    }
}

在这里插入图片描述

这样这道题就解决了!总的来说这道题需要通过剪枝来找到解决重复问题的条件,并根据条件画出决策树进而编写dfs函数体!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Transformer的Decoder的输入输出都是什么

目录 1 疑问&#xff1a;Transformer的Decoder的输入输出都是什么 2 推理时Transformer的Decoder的输入输出 2.1 推理过程中的Decoder输入输出 2.2 整体右移一位 3 训练时Decoder的输入 参考文献&#xff1a; 1 疑问&#xff1a;Transformer的Decoder的输入输出都是什么 …

SQLite数据库中JSON 函数和运算符

返回&#xff1a;SQLite—系列文章目录 上一篇:维护SQLite的私有分支&#xff08;二十六&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​ 1. 概述 默认情况下&#xff0c;SQLite 支持 29 个函数和 2 个运算符 处理 JSON 值。还有两个表值函数可用于分解 JSON…

最优算法100例之52-合并两个单调递增的单链表

专栏主页&#xff1a;计算机专业基础知识总结&#xff08;适用于期末复习考研刷题求职面试&#xff09;系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 合并两个单调递增的单链表 题解报告 解法1&#xff1a;采用尾插法首先确定一个头结点出来&a…

【Java EE】关于Spring MVC 响应

文章目录 &#x1f38d;返回静态页面&#x1f332;RestController 与 Controller 的关联和区别&#x1f334;返回数据 ResponseBody&#x1f38b;返回HTML代码片段&#x1f343;返回JSON&#x1f340;设置状态码&#x1f384;设置Header&#x1f338;设置Content-Type&#x1f…

【halcon】C# halcon 内存暴增 续,找到一个解决方案

这里写自定义目录标题 背景释放临时缓存具体的使用感受背景 在之前的文章《【halcon】C# halcon 内存暴增 》中我们提到了一些会导致内存暴增的原因。 其中一个就是使用了计算复杂的算子,且图片很大时,此时内存就会暴增,而且内存无法被释放。 这次,我在做一个项目时,用到…

一个开源的全自动视频生成软件MoneyPrinterTurbo

只需提供一个视频 主题 或 关键词 &#xff0c;就可以全自动生成视频文案、视频素材、视频字幕、视频背景音乐&#xff0c;然后合成一个高清的短视频。 一&#xff1a;功能特性 完整的 MVC架构&#xff0c;代码 结构清晰&#xff0c;易于维护&#xff0c;支持 API 和 Web界面…

软件杯 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…

复习回顾ES6基础篇(一小时学会es6)

基本语法 多行注释 /* 这里的所有内容 都是注释。 */单行注释 // 这是一条注释。变量定义 var x "" //定义范围变量 let y "" //定义局部变量 const z "" //定义常量运算符 变量类型 流程语句 if (condition) {/* 条件为真时运行的代…

LVM与磁盘配额

目录 一.LVM概述 1.LVM &#xff08;Logical Vokume Manager &#xff09;逻辑卷管理 2.LVM的管理命令 3.创建并使用LVM操作步骤 二.磁盘配额概述 1.实现磁盘限额的条件 2.Linux磁盘限额的特点 3.实现磁盘配额的步骤 三.总结&#xff1a; 一.LVM概述 1.LVM &#xff…

【静态分析】软件分析课程实验-前置准备

课程&#xff1a;南京大学的《软件分析》课程 平台&#xff1a;Tai-e&#xff08;太阿&#xff09;实验作业平台 1. 实验概述 Tai-e 是一个分析 Java 程序的静态程序分析框架&#xff0c;相比于已有的知名静态程序分析框架&#xff08;如 Soot、Wala 等&#xff09;&#xf…

《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)

1.简介 页面对象模型&#xff08;Page Object Model&#xff09;在Selenium Webdriver自动化测试中使用非常流行和受欢迎&#xff0c;作为自动化测试工程师应该至少听说过POM这个概念。本篇介绍POM的简介&#xff0c;接下来宏哥一步一步告诉你如何在你JavaSelenium3自动化测试…

算法打卡day36

今日任务&#xff1a; 1&#xff09;01背包问题理论基础(卡码网&#xff1a;46. 携带研究材料) 2&#xff09;01背包问题滚动数组(卡码网&#xff1a;46. 携带研究材料) 3&#xff09;416. 分割等和子集 4&#xff09;复习day11 卡码网&#xff1a;46. 携带研究材料 题目链接&…

35、链表-LRU缓存

思路&#xff1a; 首先要了解LRU缓存的原理&#xff0c;首先定下容量&#xff0c;每次get请求和put请求都会把当前元素放最前/后面&#xff0c;如果超过容量那么头部/尾部元素就被移除&#xff0c;所以最近最少使用的元素会被优先移除&#xff0c;保证热点数据持续存在。 不管放…

排序(三)——快速排序(递归以及栈和队列实现非递归)超详细

目录 1.hoare法 2.挖坑法 3.前后指针法 4.快排的非递归 4.1 栈实现快排非递归 4.2 队列实现快排非递归 快排我们之前在学习通讯录的时候就用了&#xff0c;那时候我们知道快排是一个很牛逼的排序算法&#xff0c;那他到底是怎么实现的呢&#xff1f; 1.hoare法 快速排序…

【Redis 神秘大陆】003 数据类型使用场景

三、Redis 数据类型和使用场景 Hash&#xff1a;对象类型的数据&#xff0c;购物车List&#xff1a;队列/栈Set&#xff1a;String类型的无序集合&#xff0c;intset&#xff0c;抽奖、签到、打卡&#xff0c;商品评价标签Sorted Set&#xff1a;存储有序的元素&#xff0c;zip…

六、OpenFeign服务接口调用

一、提问 已经有loadbalancer为什么还要学习OpenFeign? 两个都有道理的话&#xff0c;日常用那个&#xff1f; 二、是什么 OpenFeign是什么 官网翻译 Feign是一个声明性web服务客户端。它使编写web服务客户端变得更容易。使用Feign创建一个接口并对其进行注释。它具有可…

【InternLM 实战营第二期笔记】LMDeploy 量化部署 LLMVLM实战

Huggingface与TurboMind介绍 Huggingface HuggingFace是一个高速发展的社区&#xff0c;包括Meta、Google、Microsoft、Amazon在内的超过5000家组织机构在为HuggingFace开源社区贡献代码、数据集和模型。可以认为是一个针对深度学习模型和数据集的在线托管社区&#xff0c;如…

python 列表对象函数

对象函数必须通过一个对象调用。 列表名.函数名() append() 将某一个元素对象添加在列表的表尾 如果添加的是其他的序列&#xff0c;该序列也会被看成是一个数据对象 count() 统计列表当中 某一个元素出现的次数 extend() 在当前列表中 将传入的其他序列的元素添加在表尾…

【AIGC】AIGC在虚拟数字人中的应用:塑造未来互动体验的革新力量

&#x1f680; &#x1f680; &#x1f680;随着科技的快速发展&#xff0c;AIGC已经成为引领未来的重要力量。其中&#xff0c;AIGC在虚拟数字人领域的应用更是引起了广泛关注。虚拟数字人作为一种先进的数字化表达形式&#xff0c;结合了3D建模、动画技术、人工智能等多种先进…

Kubernetes对象的定义和操作

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列、spring教程等&#xff0c;大家有兴趣的可以看一看 &#x1f4d9;Jav…