代码随想录算法训练营第二十九天|491.递增子序列、46.全排列、47.全排列 II
目录
491.递增子序列
46.全排列
47.全排列 II
491.递增子序列
本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。
代码随想录
视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili
题解思路:
本题还是有点坑的,这里的如何记录使用过的数组的方式很容易给人造成误解,具体的解释如下:
1、使用数组来做哈希,初始化数组里面的元素都设置为0,如果设置成全局变量,那么每轮递归的时候相同元素只能使用一次,以[4,6,7,7]来说,不能取到4677这个组合的,显然不符合题意,因为本题不是对排序后的数组进行树层去重的,因此出现相同元素不一定是相邻元素,只能出现一个记录一个。
2、每次递归数组uesd都会重置为0的代码直接嵌套在递归里面,因为树枝不需要去重的,需要及时把使用过的元素重置为0;回溯的时候之前标记为1的地方仍然为1,并没有重置为0。
以上两点的解读就是为什么不把uesd设置为全局变量,使用used[nums[i] + 100] = 0把使用过的元素重置为0,而是直接嵌套在递归里面,可以及时往下搜索的时候及时置为0,不会造成树枝去重的原理,
class Solution {LinkedList<Integer> path = new LinkedList<>();List<List<Integer>> result = new ArrayList<>();public List<List<Integer>> findSubsequences(int[] nums) {backtracking(nums, 0);return result;}public void backtracking(int[] nums, int startIndex){if(path.size() > 1 ) result.add(new LinkedList<Integer>(path));if(startIndex == nums.length) return;int[] used = new int[201]; //使用数组来做哈希,初始化数组里面的元素都设置为0,如果设置成全局变量,那么每轮递归的时候相同元素只能使用一次,以[4,6,7,7]来说,不能取到4677这个组合的,显然不符合题意。因为本题不是对排序后的数组进行树层去重的,因此出现相同元素不一定是相邻元素,只能出现一个记录一个。//具体方式解读为:这里每次递归数组uesd都会重置为0,因为树枝不需要去重的,需要及时把使用过的元素重置为0;回溯的时候之前标记为1的地方仍然为1,并没有重置为0。这就是为什么不把uesd设置为全局变量,使用used[nums[i] + 100] = 0把使用过的元素重置为0,而是直接嵌套在递归里面,可以及时往下搜索的时候及时置为0,不会造成树枝去重的原理,for(int i = startIndex; i < nums.length; i++){if((path.size() != 0 && nums[i] < path.getLast()) || used[nums[i] + 100] == 1 ){continue;}used[nums[i] + 100] = 1;path.add(nums[i]);backtracking(nums, i + 1);path.removeLast();}}
}
46.全排列
本题重点感受一下,排列问题 与 组合问题,组合总和,子集问题的区别。 为什么排列问题不用 startIndex
代码随想录
视频讲解:组合与排列的区别,回溯算法求解的时候,有何不同?| LeetCode:46.全排列_哔哩哔哩_bilibili
题解思路:
排列和组合问题还是有区别的,和组合最大的区别在于求全排列问题,每层都是从0开始搜索而不是startIndex,需要used数组记录path里都放了哪些元素了!!!最后对听卡哥视频讲解思路,然后自己写出来最好,u1s1听卡哥讲算法是一种享受!!!本题需要注意的一点就是: if(used[i] == true) continue;在每轮递归中求全排列中都是从0开始搜索,需要通过uesd的数组记录path中已经添加过的元素,添加过的元素直接跳过就行
class Solution {LinkedList<Integer> path = new LinkedList<>();List<List<Integer>> result = new ArrayList<>();boolean[] used; //需要used数组记录path里都放了哪些元素了public List<List<Integer>> permute(int[] nums) {used = new boolean[nums.length];backtracking(nums);return result;}public void backtracking(int[] nums){if(path.size() == nums.length){result.add(new LinkedList<Integer>(path));return;}for(int i = 0; i < nums.length; i++){ if(used[i] == true) continue;//在每轮递归中求全排列中都是从0开始搜索,需要通过uesd的数组记录path中已经添加过的元素,添加过的元素直接跳过就行path.add(nums[i]);used[i] = true;backtracking(nums);path.removeLast();used[i] = false;}}
}
47.全排列 II
本题 就是我们讲过的 40.组合总和II 去重逻辑 和 46.全排列 的结合,可以先自己做一下,然后重点看一下 文章中 我讲的拓展内容。 used[i - 1] == true 也行,used[i - 1] == false 也行
代码随想录
视频讲解:回溯算法求解全排列,如何去重?| LeetCode:47.全排列 II_哔哩哔哩_bilibili
题解思路:
本题需要先把数组进行排序,使得相同的元素相邻才好进行树层去重,具体的注意细节代码中有详细注释,本题容易疑惑的两行代码见如下分析:
1、if(i > 0 && nums[i] == nums[i -1] && used[i - 1] == false) continue; //为了避免以相同元素开头的组合重复添加到结果集中进行树层去重
2、if(used[i] == true) continue; //在每轮递归中求全排列中都是从0开始搜索,需要通过uesd的数组记录path中已经添加过的元素,添加过的元素直接跳过就行
class Solution {LinkedList<Integer> path = new LinkedList<>();List<List<Integer>> result = new ArrayList<>();boolean[] used;public List<List<Integer>> permuteUnique(int[] nums) {used = new boolean[nums.length];Arrays.sort(nums); //需要先把数组进行排序,使得相同的元素相邻才好进行树层去重backtracking(nums);return result;}public void backtracking(int[] nums){if(path.size() == nums.length){result.add(new LinkedList<Integer>(path));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] == true) continue; //在每轮递归中求全排列中都是从0开始搜索,需要通过uesd的数组记录path中已经添加过的元素,添加过的元素直接跳过就行path.add(nums[i]);used[i] = true;backtracking(nums);used[i] = false;path.removeLast();}}
}
相关文章:
代码随想录算法训练营第二十九天|491.递增子序列、46.全排列、47.全排列 II
目录 491.递增子序列 46.全排列 47.全排列 II 491.递增子序列 本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。 代码随想录 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序…...
【Kafka】Kafka监控工具Kafka-eagle简介
Kafka-eagle是一种基于Web的开源管理工具,可以用来监控、管理多个Kafka集群。 下面是使用Docker部署Kafka-eagle的步骤: 下载并安装Docker和Docker Compose。 创建文件夹,例如kafka-eagle,并在其中创建docker-compose.yml文件&a…...
Java操作MongoDB
上一篇文章: http://blog.csdn.net/gaowenhui2008/article/details/40045719 介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过前一篇文章我们对MongoDB有了全面的认识和理解。现在我们就用Java来操作MongoDB的数据。 开发环境: System:…...
Java断言(assert)的介绍和使用
Java断言(assert)的介绍和使用 在Java编程中,断言(assert)是一种有用的工具,用于在代码中进行条件检查和调试。通过使用断言,我们可以验证程序的逻辑和假设,确保程序在运行时达到预…...

我的世界Fabric mod开发-快速漏斗
前往我的主页以阅读完整内容,并获取源码 DearXuan的主页 MOD介绍 使用漏斗链进行分类或传递物品时,常常会发现漏斗速度太慢,难以收集全部掉落物.或者漏斗太多,影响性能.而现有的漏斗加速mod则是引入新的快速漏斗,存在各种兼容问题.开服时发现paper服务器可以修改原…...

AI“应用商店”来了!OpenAI首批70个ChatGPT Plugin最全梳理
OpenAI放出大招,本周将向所有ChatGPT Plus用户开放联网功能和众多插件本周将向所有ChatGPT Plus用户开放联网功能和众多插件,允许ChatGPT访问互联网并使用70个第三方插件。 本批第三方插件能够全方位覆盖衣食住行、社交、工作以及学习等日常所需&#x…...

NSS LitCTF部分wp
web 1、PHP是世界上最好的语言!! 直接cat flag flagNSSCTF{11eaebe0-3764-410d-be83-b23532a24235} 2、这是什么?SQL !注一下 ! 直接查询,发现注入点是id 使用sqlmap列出所以数据库 sqlmap -u "h…...

【开发者指南】如何在MyEclipse中编辑HTML或JSP文件?(一)
MyEclipse v2022.1.0正式版下载 如果您有HTML或JSP文件要编辑,这里将介绍如何编辑。查找以下信息: 编辑源代码大纲和属性视图参数页面 该功能在MyEclipse中是可用的。 一、HTML / JSP编辑器 要编辑HTML或JSP文件,请执行以下操作当中的一…...
关于博客停更的原因
进入我的主页浏览一下,就可以发现我写到linux就不写了,c后面页不写了,题解也不更新了,确实,我承认我懒惰了,我选择了向后学习,而不是总结,写博客是一个良好的习惯和面试官看到的能够…...

智能感知编码优化与落地实践
作者 | XHF 导读 基于人眼视觉特性出发的感知编码优化技术,成为互联网短视频、OTT 等 UGC 场景的重点优化手段,可以在降低视频码率的同时,提升视频的观看体验。 今天主要有 4 个方面的内容。首先给大家介绍一下感知编码的技术背景;…...

OpenCL编程指南-5.1工作项函数-整数函数-公共函数
工作项函数 应用程序使用clEnqueueNDRangeKernel和 clEnqueueTask API将OpenCL中的数据并行和任务并行内核排队。对于一个数据并行内核(使用clEnqueueNDRangeKernel排队等待执行),应用程序会指定全局工作大小,即可以并行执行这个内核的工作项…...

教你接入Midjourney,不用梯子也能玩
1、效果 话不多说,先上最终出图效果, 我给的关键词是一只白色的猫 2、接入流程 API文档可以来这里查(可以白嫖100次midjourney出图和10次gpt4体验),我这里精简一下接入流程,方便大家快速接入 2.1、文字生…...

Mysql中常用到的查询关键字
文章目录 1、join2、like 模糊查询3、or4、distinct5、in 包含6、group by 分组7、order by8、limit 1、join MySQL 的连接主要分为内连接和外连接。 什么是内连接: 取得两张表中满足存在连接匹配关系的记录。 什么是外连接: 不只取得两张表中满足存在…...
【ROS】ROS1工具详解
1、roscore 1.1 说明 运行roscore,将会启动三个功能:ROS Master主节点、ROS参数服务器和记录ROS日志输出节点 1.2 用法 roscore [可选参数]1.3 参数详解 -h, --help,帮助信息 -p PORT, --portPORT,指定端口号,默认…...
论Plant Simulation中的Init的使用及调用顺序
往期内容回顾: 一文搞懂Plant Simulation中的Rotation设置 Plant Simulation与python之Socket通信的数据交互问题 自主移动机器人模型制作 写在开头 在阅读之前,可以先尝试回答一下如下问题,如果都能答得上来,这篇文章就可以忽略不看了。 Q1:对于主模型中包括多…...

nginx实现正向代理
1.下载nginx nginx: download 选择自己需要的版版本下载下来 2.解压文件修改ngixn.conf配置文件 events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout…...
【spark】
实验5 Spark Structured Streaming编程实践 实验内容和要求 0.结构化流练习任务 0.1 讲义文件源-json数据任务。按照讲义中json数据的生成及分析,复现实验,并适当分析。 (1)创建程序生成JSON格式的File源测试数据 import osimp…...
ADO.NET 面试题
这里写自定义目录标题 什么是 ADO.NET?ADO.NET 的主要特点有哪些?ADO.NET 的四个组件分别是什么?什么是 Connection 串?Connection 的状态有哪些?什么是 DataAdapter?DataAdapter 的作用是什么?…...

第三篇、基于Arduino uno,用oled0.96寸屏幕显示dht11温湿度传感器的温度和湿度信息——结果导向
0、结果 说明:先来看看拍摄的显示结果,如果是你想要的,可以接着往下看。 1、外观 说明:本次使用的oled是0.96寸的,别的规格的屏幕不一定适用本教程,一般而言有显示白色、蓝色和蓝黄一起显示的࿰…...

什么是npu算力盒子,算力是越大越好吗?
一、什么是npu算力盒子?该怎么选? NPU(神经处理单元)算力盒子是一种专门用于进行人工智能计算的硬件设备,其中集成了高性能的NPU芯片。NPU是一种针对深度学习任务进行优化的处理器,具备高度并行计算和低功…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...

Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

Matlab实现任意伪彩色图像可视化显示
Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的亮度(或…...

【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...