代码随想录算法训练营第二十九天|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是一种针对深度学习任务进行优化的处理器,具备高度并行计算和低功…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
