代码随想录算法训练营第29天 | 491.递增子序列 46.全排列 47.全排列II

news2024/9/28 15:29:50

非递减子序列

Alt
这道题与子集II比较相似,子序列也是子集,而且这里数组中也包含重复元素。但是这道题要有序的序列,所以不能对原来的数组先进行排序。但我们前一篇文章总结过:子集问题中涉及重复元素时,是需要排序的。
这里还需要细化总结一下,树层去重可以做到去除元素和排列顺序都相同的组合,无法去除 [4,1,4] 和 [4,4,1] 这样顺序不同的情况。而经过排序之后这个问题就解决了,这道题本身就限制了元素顺序,所以只要能去除元素和顺序都相同的重复组合就行了。

class Solution{
public:
	vector<vector<int>> result;
	vector<int> path;
	void backtracking(vector<int>& nums, int startIndex){
		if(path.size() > 1){  // 要求path中有两个及以上元素
			result.push_back(path);  // 不要return,因为要在递归过程中始终记录
		}
		unordered_set<int> uset;  // 进行树层去重
		for(int i = startIndex; 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){
		result.clear();
		path.clear();
		backtracking(nums, 0);
		return result;
	}
};

这里也可以用数组实现哈希表,代码的性能更好,因为数组中元素值范围不大。

全排列

Alt
全排列问题需要注意 [1,2] 和 [2,1] 是两种不同的排列,因此不需要 startIndex 避免组合的重复出现。但是仍然需要在树枝上记录用过的元素,避免一个排列中元素重复。

class Solution{
public:
	vector<vector<int>> result;
	vector<int> path;
	void backtracking(vector<int>& nums, vector<bool>& used){
		if(path.size() == nums.size()){
			result.push_back(path);
			return;
		}
		for(int i = 0; i < nums.size(); i++){
			if(used[i] == true)  continue;
			used[i] = true;
			path.push_back(nums[i]);
			backtracking(nums, used);
			path.pop_back();
			used[i] = false;
		}
	}
	vector<vector<int>> permute(vector<int>& nums){
		result.clear();
		path.clear();
		vector<bool> used(nums.size(), false);
		backtracking(nums, used);
		return result;
	}
};

全排列II

Alt
这道题与组合问题II也是相似的,数组中有重复的元素。所以仍然可以借鉴全排列和组合问题II的思路。注意需要判断used[i - 1],因为不能用 startIndex 在树枝上做去重。有趣的是,判断used[i - 1] == trueused[i - 1] == false都是可以的,可以画图验证做树层去重剪枝效果更好。

class Solution{
public:
	vector<vector<int>> result;
	vector<int> path;
	void backtracking(vector<int>& nums, vector<bool>& used){
		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]){
				used[i] = true;
				path.push_back(nums[i]);
				backtracking(nums, used);
				path.pop_back();
				used[i] = false;
			}
		}
	}
	vector<vector<int>> permuteUnique(vector<int>& nums){
		result.clear();
		path.clear();
		sort(nums.begin(), nums.end());
		vector<bool> used(nums.size(), false);
		backtracking(nums, used);
		return result;
	}
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pdf添加页眉的4种工具!

在现代数字化的世界中&#xff0c;PDF格式已经成为最常用的文件格式之一&#xff0c;它不仅易于阅读&#xff0c;还具有良好的兼容性。然而&#xff0c;有时候我们需要对PDF文件进行一些修改&#xff0c;例如添加页眉。那么&#xff0c;我们该如何实现这一目标呢&#xff1f;今…

按键协管指南针加速计陀螺仪GPS等原理图纸2

1.imu电路。 加速计包含重力感应。 到传感器芯片u8, U16, U18的信息都是用的spi接口&#xff0c;如下图所示。OSCAR_TO_IMU_SPI_SCLK_FL, IMU_TO_OSCAR_SPI_MISO_FL, OSCAR_TO_IMU_SPI_MOSI_FL接了u8, u16, u18,通过片选信号cs选择哪个芯片接收。 加速计&#xff0c;陀螺仪&…

【开源】基于JAVA+Vue+SpringBoot的音乐平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示 四、核心代码4.1 查询单首音乐4.2 新增音乐4.3 新增音乐订单4.4 查询音乐订单4.5 新增音乐收藏 五、免责说明 一、摘要 1.1 项目介绍 基于微信小程序JAVAVueSpringBootMySQL的音乐平台&#xff0c;包含了音乐…

大数据处理,Pandas与SQL高效读写大型数据集

大家好&#xff0c;使用Pandas和SQL高效地从数据库中读取、处理和写入大型数据集&#xff0c;以实现最佳性能和内存管理&#xff0c;这是十分重要的。 处理大型数据集往往是一项挑战&#xff0c;特别是在涉及到从数据库读取和写入数据时。将整个数据集加载到内存中的传统方法可…

Leetcode—2696. 删除子串后的字符串最小长度【简单】

2023每日刷题&#xff08;八十八&#xff09; Leetcode—2696. 删除子串后的字符串最小长度 实现代码 class Solution { public:int minLength(string s) {string sub " ";for(auto c: s) {if((c B && sub.back() A) || (c D && sub.back() C…

AP5101C 高压线性 LED恒流驱动器 DFN2*2 LED灯汽车雾灯转向灯

产品描述 AP5101C 是一款高压线性 LED 恒流芯片 &#xff0c; 简单 、 内置功率管 &#xff0c; 适用于6- 100V 输入的高精度降压 LED 恒流驱动芯片。电流2.0A。AP5101C 可实现内置MOS 做 2.0A,外置 MOS 可做 3.0A 的。AP5101C 内置温度保护功能 &#xff0c;温度保护点为 130 …

creo草绘3个实例学习笔记

creo草绘3个实例 文章目录 creo草绘3个实例草绘01草绘02草绘03 草绘01 草绘02 草绘03

Higress 开源一周年:新版本,新标准,新工具,新征程

作者&#xff1a;Higress 团队 历程回顾 Higress 开源一年时间&#xff0c;一共发布了 18 个 release 版本&#xff0c;收获了 40 多位社区贡献者和 1800 star&#xff0c;上图是这一年过来达成的一些关键的里程碑。 前面半年通过集成开源生态&#xff0c;打磨开源版本稳定性…

垃圾回收小程序:环保与便捷的完美结合

一、引言 随着科技的发展&#xff0c;移动应用程序已经成为人们日常生活中不可或缺的一部分。其中&#xff0c;废品回收小程序以其独特的价值和功能&#xff0c;日益受到人们的关注和青睐。本文将探讨废品回收小程序开发的重要性、功能特点、技术实现和未来发展趋势。 二、废…

折线的可视化及不规则柱体的绘制

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example demo解决问题&#xff1a; 1.绘制一条多段线&#xff08;折现&#xff09;&#xff0c;并可视化这段折现&#xff1b;2.根据折现绘制一个不规则柱体 关键点 : vtk…

ANN论文总结

本文主要是个人笔记&#xff0c;记录与存储相关的ANN工作&#xff0c;想着写都写了不如发出来与大家分享&#xff0c;大多写得比较简单有些稍微详细一点&#xff0c;内容仅供参考。 CognitiveSSD S. Liang, Y. Wang, Y. Lu, et al. Cognitive SSD: A Deep Learning Engine for…

【学网攻】 第(7)节 -- 生成树配置

文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan【学网攻】 第(5)节 -- Cisco VTP的使用【学网攻】 第(6)节 -- 三层交换机实现VLAN间路由 前言 网络已经成为…

Java 字符串 04 练习-用户登录

自己写的代码&#xff1a; import java.util.Scanner; public class practice {static String rightUsername "zhangsan";static String rightPassword "123456";public static void main(String[] args) {//读题拆解法//1、定义两个变量&#xff0c;记…

并查集与图

并查集与图 一、并查集概念实现原理代码实现查找根节点合并两颗树判断是否是同一棵树树的数量 二、图的基本概念定义分类完全图顶点的度连通图 三、图的存储结构分类邻接表邻接表的结构代码实现 邻接矩阵代码实现 四、图的遍历方式广度优先深度优先 五、最小生成树概念Kruskal算…

在linux部署Prometheus+Grafana+Exporter监控系统性能

Prometheus、Grafana和Report组件是什么&#xff1f; Prometheus、Grafana和Exporter是常用于系统监控和指标收集的组合。 Prometheus是一种开源的系统监控和警报工具。它可以收集各种指标数据&#xff0c;并提供强大的查询语言和灵活的警报规则&#xff0c;用于实时监控系统…

ChatGPT+Midjourney+闲鱼赚钱方法实战探索

最近天天在朋友群内看到朋友接单(出售提示词&#xff0c;图片&#xff09;&#xff0c;轻轻松松半小时就赚200-300&#xff0c;特意探索了一下相关玩法&#xff0c;总结出一套ChatGPTMidjourney闲鱼赚钱方法&#xff0c;主打的是易上手&#xff0c;有可操作性&#xff01; 具体…

03. 静态路由

文章目录 一. 静态路由概述1.1. 概述1.2. 路由信息获取方式1.3. 路由表的参数1.4. 路由协议的优先级1.5. 最优路由条目优先1.6. 最长前缀匹配原则 二. 实验实操2.1. 实验1&#xff1a;静态路由2.1.1. 实验目的2.1.2. 实验拓扑图2.1.3. 实验步骤&#xff08;1&#xff09;配置网…

计算机网络的体系结构的各层在整个过程中起到什么作用?

ps&#xff1a;本文章的图片内容来源都是来自于湖科大教书匠的视频&#xff0c;声明&#xff1a;仅供自己复习&#xff0c;里面加上了自己的理解 这里附上视频链接地址&#xff1a;1.6 计算机网络体系结构&#xff08;4&#xff09;—专用术语_哔哩哔哩_bilibili 目录 &#x…

uniapp上传音频文件到服务器

视频教程地址&#xff1a; 【uniapp录音上传组件&#xff0c;将录音上传到django服务器】 https://www.bilibili.com/video/BV1wi4y1p7FL/?share_sourcecopy_web&vd_sourcee66c0e33402a09ca7ae1f0ed3d5ecf7c uniapp 录制音频文件上传到django服务器保存到服务器 &#xf…

binary_search_tree的介绍与实现(二叉搜索树精美图示详解哦)

二叉搜搜索树 引言二叉搜索树的介绍二叉搜索树的实现框架默认成员函数构造析构赋值重载 InsertR&#xff08;插入&#xff09;EraseR&#xff08;删除&#xff09;SearchR&#xff08;查找&#xff09; 源码概览总结 引言 在C语言部分&#xff0c;我们已经认识了树与二叉树的结…