123、【回溯算法】leetcode ——491. 递增子序列:unordered_set去重和int数组去重(C++版本)

news2024/9/21 15:40:33

题目描述

在这里插入图片描述
在这里插入图片描述
原题描述:491. 递增子序列

解题思路

此题也是子集问题,但和 90.子集II (子集问题+startIndex去重) 的区别在于:(1)存储结果集判定条件;(2)输入数据的排列顺序;(3)去重方式

  1. 存储结果集判定条件:只有当结果的个数大于或等于2时,才能存储;
  2. 输入数据的排列方式:因存储的是原数据的递增子序列,因此需要保留原排列顺序
  3. 去重方式:原数据中并不一定全是递增排序,因此可能会出现重复的数字,但并不相邻排列,因此不能用之前的去重方式进行去重。由于去重的为单层,出现过的重复元素,因此可以在每层遍历的时候设置一个Hash表判定对应元素是否出现过,若出现过,则跳过该种情况,没出现过则记录该种情况。

1、使用unordered_set作为Hash表

class Solution {
public:
    vector<int> path;
    vector<vector<int>> res;
    void backtracking(vector<int> nums, int startIndex) {
        // 将数列存入结果集中
        if(path.size() >= 2) {
            res.push_back(path);
        }        
        unordered_set<int> record;          // 树层去重,因此只用记录每层中是否选取重复数值
        for(int i = startIndex; i < nums.size(); i++) {
            // 结果中为空或者为递增数列时,如果每存储过该元素,则存入,否则跳过此种情况
            if(path.size() == 0 || nums[i] >= path.back()) {                
                if(record.find(nums[i]) == record.end()) {      // 没存过时存入,存过的话说明出现重复元素,跳过
                    record.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 res;
    }
}; 

2、使用数组作为Hash表

因为题中条件已经规定了nums的取值范围为[-100, 100],故通过加上100的方式,把数映射到[0, 200]中,共201个数值。

class Solution {
public:
    vector<int> path;
    vector<vector<int>> res;
    void backtracking(vector<int> nums, int startIndex) {
        // 将数列存入结果集中
        if(path.size() >= 2) {
            res.push_back(path);
        }        
        int record[201] = {0};          // 采用数组方式,因nums范围为[-100,100],使用+100作为偏移量,将nums映射到[0,200]之间(共201个数)
        for(int i = startIndex; i < nums.size(); i++) {
            // 结果中为空或者为递增数列时,如果每存储过该元素,则存入,否则跳过此种情况
            if(path.size() == 0 || nums[i] >= path.back()) {                
                if(record[nums[i] + 100] == 0) {      // 没存过时存入,存过的话说明出现重复元素,跳过
                    record[nums[i] + 100]++;
                    path.push_back(nums[i]);
                    backtracking(nums, i + 1);
                    path.pop_back();
                }                
            }            
        }
    }
    vector<vector<int>> findSubsequences(vector<int>& nums) {        
        backtracking(nums, 0);
        return res;
    }
}; 

参考文章:491.递增子序列

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

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

相关文章

Python学习笔记十二之十大经典排序算法

Python学习笔记十二之十大经典排序算法 排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;…

zos JESMSGLG 不显示 job steps return codes

zos JESMSGLG 不显示 job steps return codes 在普通学习的时候&#xff0c;SDSF 查看 JCL 结果&#xff0c;可能并不会注意到下面结果有什么差别 但跟公司的大型机出的结果是不同的&#xff0c;就是缺少了 job steps return codes&#xff0c;在 STARTED 和 ENDED 中间应该有…

【Linux】冯诺依曼体系结构和操作系统

目录 一、冯诺依曼体系结构 1.组成 2.各结构特性 二、操作系统 1.概念 2.设计OS的目的 3.如何理解 "管理" 4.系统调用 一、冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依…

浅析故障电弧探测器在电气防火中的作用与应用介绍

安科瑞 李雨轩【摘要】&#xff1a; 分析了重大电气火灾数据。结合目前国内前沿的电气火灾探测技术&#xff0c;重点介绍了故障电弧式电气火灾监控探测器在火灾预警系统中的重要作用&#xff0c;给出了基于多种探测技术的电气火灾监控系统的实现方案。【关键词】&#xff1a;故…

C++模板初阶小笔记

目录 一.泛型编程 二.函数模板 1.函数模板语法梳理&#xff1a; 2.函数模板的实例化&#xff1a; 3.函数模板的显式实例化&#xff1a; 4.函数模板使用时的注意事项 三.类模板 1.类模板的语法梳理 2.类模板中声明和定义分离的成员函数 一.泛型编程 泛型编程&#xff…

【C++】类和对象---什么是类?

目录1.面向过程和面向对象初步认识2.类的引入2.1使用struct定义类3.类的定义3.1类的两种定义方式&#xff1a;3.2成员变量命名规则的建议3.3成员函数与成员变量定义的位置建议4.类的访问限定符及封装4.1访问限定符4.2封装5.类的作用域6.类的实例化7.类对象模型7.1如何计算类对象…

Kali Linux渗透

Kali Linux是基于Debian的Linux发行版&#xff0c; 设计用于数字取证操作系统。每一季度更新一次。 黑盒测试&#xff0c;它是通过测试来检测每个功能是否都能正常使用。在测试中&#xff0c;把程序看作一个不能打开的黑盒子&#xff0c;在完全不考虑程序内部结构和内部特性的情…

从C语言的使用转换到C++(上篇)——刷题、竞赛篇

文章目录 一、C的基础语法详解 1、1 输入、输出流 1、2 C中头文件的使用 1、3 C中变量的声明 1、4 C中的string类 1、5 C中的引用& 二、C中常见函数使用详解 2、1 排序sort函数详解 2、2 cctype头文件中的函数 三、总结 标题&#xff1a;从C语言的使用转换到C&#xff08;上…

④【Spring】IOC - 基于注解方式 管理bean

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 注解管理Bean一、注解的功能二、四个典型注解三…

day24|491.递增子序列、46.全排列、47.全排列 II

491.递增子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一种特殊情况…

源码深度解析Spring Bean的创建,手把手的一步一步带你看源码

在源码深度解析Spring Bean的加载 中对Bean的加载源码进行了梳理,在本文将对bean的创建进行梳理 在doGetBean()方法中createBean()方法准备创建bean,调用源码如下: createBean() 方法的源码如下: 从代码中可以得出,createBean() 方法涉及4个步骤: 步骤一: 根据设置的class属…

[论文笔记]A ConvNet for the 2020s

目录 Abstract Modernizing a ConvNet: a Roadmap 2.1.Training Techniques 2.2. Macro Design 2.3. ResNeXt-ify 2.4. Inverted Bottleneck 2.5. Large Kernel Sizes 2.6. Micro Design 论文&#xff1a;https://arxiv.org/abs/2201.03545 代码&#xff1a;GitHub - f…

扩散模型(Diffusion model)代码详细解读

扩散模型代码详细解读 代码地址&#xff1a;denoising-diffusion-pytorch/denoising_diffusion_pytorch.py at main lucidrains/denoising-diffusion-pytorch (github.com) 前向过程和后向过程的代码都在GaussianDiffusion​这个类中。​ 常见问题解决 Why self-condition…

盒相关样式-----diaplay:block、inline

盒的基本类型 CSS中的盒分为block类型与inline类型&#xff0c;例如&#xff0c; div元素与p元素属于block类型&#xff0c; span元素与a元素属于inline类型。 block类型的盒对应的是html中的块级元素&#xff0c;inline类型的盒对应了html中的行内元素。 行内元素与块级元素…

JavaScript 练手小技巧:键盘事件

键盘事件应该是鼠标事件之外&#xff0c;使用频率最高的 JS 事件了吧&#xff1f; 一般用于全局或者表单。 键盘事件由用户击打键盘触发&#xff0c;主要有keydown、keypress、keyup三个事件。 keydown&#xff1a;按下键盘时触发。Ctrl、Shift、Alt 等和其它按键组合时&…

BCNF与3NF

今天学了一下午这个BCNFBCNFBCNF与3NF3NF3NF&#xff0c;有感而发&#xff0c;特来总结。好像好久不打键盘了&#xff0c;这手好像刚长出来的一样。本文浅显的分析一下两种范式的关系与不同以及判断方法和分解算法&#xff0c;以做总结。 BCNFBCNFBCNF范式的定义如下: 设属性集…

linux 常用指令大全

目录一、基本指令指令基本格式1、ls1.1 ls相关选项2、pwd3、cd4、mkdir4.1、mkdir相关选项5、touch6、cp6.1 cp相关选项7、mv8、rm8.1、rm相关选项9、输出重定向10、cat11、df11.1、df 相关选项12、free12.1、free 相关选项13、head13.1、head相关选项14、tail14.1 tail相关选项…

day13 二叉树 | 144、二叉树的前序遍历 145、二叉树的后序遍历 54、二叉树的中序遍历

二叉树基础 二叉搜索树 二叉搜索树是一个有序树。 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值&#xff1b;若它的右子树不空&#xff0c;则右子树上所有结点的值均大于它的根结点的值&#xff1b;它的左、右子树也分别为二叉排序树 下面这两棵…

零食商城|基于springboot的零食商城

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

GuLi商城-简介-项目介绍、分布式基础概念、微服务架构图

一、项目简介 1 、项目背景 1 &#xff09;、电商模式 市面上有 5 种常见的电商模式 B2B、B2C、C2B、C2C、O2O&#xff1b; 1 、 B2B 模式 B2B (Business to Business)&#xff0c; 是指商家与商家建立的商业关系。 如&#xff1a;阿里巴巴 2 、 B2C 模式 B2C (Business…