代码随想录算法训练营day29|491.递增子序列、46.全排列、47.全排列II
递增子序列
491. 非递减子序列 - 力扣(LeetCode)
非递减子序列,则答案的子集中,需保持下一个元素大于等于前一个元素的顺序,由于题目中指出,所有的子序列长度需大于等于2,考虑当条件为path.size()>1时,进行收获结果,且需要注意,这时不应该直接return,因为后续仍有可能存在子序列长度大于2的结果,仍需要继续遍历。此时结束的标志是单层遍历的结束。
如果只按照上述向下运行,没有完成子序列的去重操作,为了完成子序列的去重以及保证下一个元素大于当前元素才加入数组,考虑加入一个set,在对当前层进行遍历时,若该元素没有使用过,将其加入set,若该元素大于path的末尾元素,将其加入path。之后继续回溯,回溯完成后复原path。具体思路参考代码随想录。
代码随想录 (programmercarl.com)https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
class Solution {
public:vector<int> path; // 存储当前递增子序列vector<vector<int>> paths; // 存储所有不同的递增子序列void backtracking(vector<int>& nums, int start) {if (path.size() >= 2) {paths.push_back(path); // 将满足条件的子序列添加到结果中}unordered_set<int> uset; // 用于去重for (int i = start; i < nums.size(); ++i) {if ((!path.empty() && nums[i] < path.back()) || uset.find(nums[i]) != uset.end()) {continue; // 跳过不满足条件的元素}uset.insert(nums[i]);path.push_back(nums[i]);backtracking(nums, i + 1); // 递归搜索下一个元素path.pop_back(); // 回溯,移除当前元素}}vector<vector<int>> findSubsequences(vector<int>& nums) {backtracking(nums, 0); // 从第一个元素开始搜索return paths;}
};
回溯法寻找递增子序列的过程,在最差情况下需要遍历所有可能的子序列,每个元素都有可能存在或者不存在与子序列中,所以算法的时间复杂度为O(2^n),就空间复杂度来说,使用了哈希集合来检查是否已经包含了某个元素,使用了一个辅助的path来存储当前的子序列,在递归的过程中,path和uset都会不断改变,但最大的情况为递归的最深处,此时应有n层,因此空间复杂度为O(n)。
全排列
46. 全排列 - 力扣(LeetCode)
思路:从数组的第一个元素开始,逐步构建排列,对于每个位置,将不同的数字放在该位置上,然后递归地处理下一个位置。若当前位置已经包含了某元素,则我们要跳过它,选择其他数字,条件为
if (find(path.begin(), path.end(), nums[i]) == path.end())
治理find函数返回的迭代器等于path.end(),说明nums[i]不在path中,即当前数字还没有被使用过。
当排列的长度等于数组的长度时,收获为一个有效的排列。
if (path.size() == nums.size()) {result.push_back(path); // 当排列长度等于数组长度时,保存该排列return;}
整体代码如下。
class Solution {
public:vector<int> path; // 保存当前排列vector<vector<int>> result; // 保存所有不同的排列void backtracking(vector<int>& nums, int start) {if (path.size() == nums.size()) {result.push_back(path); // 当排列长度等于数组长度时,保存该排列return;}for (int i = 0; i < nums.size(); ++i) {if (find(path.begin(), path.end(), nums[i]) == path.end()) {// 如果当前数字不在排列中,将其添加到排列中path.push_back(nums[i]);backtracking(nums, i + 1); // 递归搜索下一个位置path.pop_back(); // 回溯,移除当前数字}}}vector<vector<int>> permute(vector<int>& nums) {backtracking(nums, 0); // 从第一个位置开始搜索return result;}
};
排列的时间复杂度为O(n!),每个位置,都可以选择不同的数字。
空间复杂度为O(n)。
全排列II
47. 全排列 II - 力扣(LeetCode)
错误代码,使用了start
class Solution {
public:vector<int> path; // 保存当前排列vector<vector<int>> result; // 保存所有不同的排列void backtracking(vector<int>& nums, int start) {if (path.size() == nums.size()) {result.push_back(path); // 当排列长度等于数组长度时,保存该排列return;}for (int i = 0; i < nums.size(); ++i) {if(start > 0 and nums[i]== nums[i - 1]){continue;}path.push_back(nums[i]);backtracking(nums, i + 1); // 递归搜索下一个位置path.pop_back(); // 回溯,移除当前数字}}vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(), nums.end()); // 首先排序,以便去除重复排列backtracking(nums, 0);return result;}
};
正确代码
class Solution {
public:vector<int> path; // 保存当前排列vector<vector<int>> result; // 保存所有不同的排列void backtracking(vector<int>& nums, vector<bool>& used, int start) {if (path.size() == nums.size()) {result.push_back(path); // 当排列长度等于数组长度时,保存它return;}for (int i = 0; i < nums.size(); ++i) {if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) {continue; // 跳过重复的元素}if (!used[i]) {path.push_back(nums[i]);used[i] = true;backtracking(nums, used, i + 1); // 递归搜索下一个位置path.pop_back(); // 回溯,移除当前数字used[i] = false;}}}vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(), nums.end()); // 首先排序,以便去除重复排列vector<bool> used(nums.size(), false); // 初始化 used 数组backtracking(nums, used, 0);return result;}
};
start可有可无
算法的时间复杂度为O(n!),空间复杂度为O(n),同上。
相关文章:

代码随想录算法训练营day29|491.递增子序列、46.全排列、47.全排列II
递增子序列 491. 非递减子序列 - 力扣(LeetCode) 非递减子序列,则答案的子集中,需保持下一个元素大于等于前一个元素的顺序,由于题目中指出,所有的子序列长度需大于等于2,考虑当条件为path.siz…...
【ARM Cache 与 MMU 系列文章 7.8 – ARMv8/v9 MMU Table 表分配原理及其代码实现 2】
请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 MMU Table 表分配原理及其代码实现MMU Table 分配代码实现MMU Table 表分配原理及其代码实现 在做映射的时候所映射的地址范围最大只能是某一级 level table 中 entry 所能支持的最大…...

SAP PP学习笔记17 - MTS(Make-to-Stock) 按库存生产(策略70)
上几章讲了几种策略,策略10,11,30,40。 SAP PP学习笔记14 - MTS(Make-to-Stock) 按库存生产(策略10),以及生产计划的概要-CSDN博客 SAP PP学习笔记15 - MTS(Make-to-St…...

网页音频提取在线工具有哪些 网页音频提取在线工具下载
别再到处去借会员账号啦。教你一招,无视版权和地区限制,直接下载网页中的音频文件。没有复杂的操作步骤,也不用学习任何代码。只要是网页中播放的音频文件,都可以把它下载到本地保存。 一、网页音频提取在线工具有哪些 市面上的…...

【ARM Cache 系列文章 2.1 -- Cache PoP 及 PoDP 介绍】
请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 PoP 及 PoDPCache PoDPCache PoP应用和影响PoP 及 PoDP Cache PoDP 点对深度持久性(Point of Deep Persistence, PoDP)是内存系统中的一个点,在该点达到的任何写操作即使在系统供电…...

一文了解JVM面试篇(上)
Java内存区域 1、如何解释 Java 堆空间及 GC? 当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建 堆空间,当程序中创建对象的时候,就从对空间中分配内存。GC 是 JVM 内部的一 个进程,回收无效对象的内存用于将来的分配。 2、JVM 的主要组成…...
C#WPF控件Textbox绑定浮点型数据限制小数位方法
本文讲解C#WPF控件Textbox绑定浮点型数据限制小数位方法。 XAML中,使用StringFormat来格式化TextBox的文本 <Window x:Class="WpfApp.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.m…...

mysql引入表名称的注意事项
1、遇到问题 mapper中的文件是这样的 解析出来的sql是这样的 sql显示为:select * from ‘tableName’ 2、解决方法 mapper文件种使用${tableName}而不是#{tableName}...

C语言数据结构快速排序的非递归、归并排序、归并排序的非递归等的介绍
文章目录 前言一、快速排序非递归二、归并排序五、归并排序非递归总结 前言 C语言数据结构快速排序的非递归、归并排序、归并排序的非递归等的介绍 一、快速排序非递归 快速排序非递归的定义 快速排序非递归,需要使用栈来实现。将左右下标分别push到栈中。在栈为…...

学生成绩管理系统(大一大作业)
功能 实现添加,排序,修改,保存等功能 库函数 #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<string.h> 头文件 #define functioncreate(major) void major##compare(mana mn){\int i,j,s…...

数据结构:模拟栈
数据结构:模拟栈 题目描述参考代码 题目描述 输入样例 10 push 5 query push 6 pop query pop empty push 4 query empty输出样例 5 5 YES 4 NO参考代码 #include <iostream>using namespace std;const int N 1000010;int m, x; int q[N]; string op; int…...
02-2.3.6 顺序表和链表的比较
喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会不断更新。🧑💻 此外,《程序员必备技能》专栏和《程序员必备工具》专栏(该专栏暂未开设)日后会逐步更新,感兴趣的小伙伴可以点一下订阅…...

C++ : 模板初阶
标题:C : 模板初阶 水墨不写bug 正文开始: C语言的问题 : 写不完的swap函数 在学习C语言时,我们有一个经常使用的函数swap函数,它可以将两个对象的值交换。 我们通常这样实现它: void swap(int t1,int t2)…...

FFA-Net:用于单图像去雾的特征融合注意力网络
摘要 论文链接:https://arxiv.org/pdf/1911.07559v2 在这篇论文中,我们提出了一种端到端的特征融合注意力网络(FFA-Net)来直接恢复无雾图像。FFA-Net架构由三个关键组件组成: 一种新颖的特征注意力(FA&…...

网工内推 | 联通公司,云计算售前,AWS认证优先
01 联通数字科技有限公司 🔷招聘岗位:云计算售前工程师 🔷职责描述: 1.了解私有云,公有云,混合云等云计算技术知识,了解云计算行业现状及发展趋势。 2.承担区域项目售前工作支持,为…...

[Redis]Zset类型
Zset有序集合相对于字符串、列表、哈希、集合来说会有一些陌生。 它保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有一个唯一的浮点类型的分数(score)与之关联,着使得有序集合中的元素是可…...

【云原生】Kubernetes----Ingress对外服务
目录 引言 一、K8S对外方式 (一)NodePort 1.作用 2.弊端 3.示例 (二)externalIPs 1.作用 2.弊端 3.示例 (三)LoadBalancer 1.作用 2.弊端 (四)Ingress 二、Ingress的…...
项目管理之maven svn
管理jar包之间依赖关系 编译、打包、清理、测试等一系列构建工具 一、Maven的标志 1、每一个maven工程都有一个pom.xml maven项目坐标 <groupId>com.aaa</groupId>//项目路径 <artifactId>web</artifactId>项目名称 <version>0.0.1-SNAPS…...

Redis篇 list类型在Redis中的命令操作
list在redis基本的命令 一.基本命令1.lpush和range2.lpushx rpushx3.lpop rpop4.lindex linsert llen5.lrem6.ltrim lset7.blpop brpop 一.基本命令 list在redis中相当于数组或者顺序表. 1.lpush和range 2.lpushx rpushx 3.lpop rpop 4.lindex linsert llen 如果要插入的列表中…...

【C++课程学习】:类和对象(上)(类的基础详细讲解)
🎁个人主页:我们的五年 🔍系列专栏:C课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 🍟1.1类的引出: 🍟1.2类的结构: 🍟1.3类的…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...