代码随想录算法训练营第二十九天|491. 非递减子序列,46.全排列

491. 非递减子序列

题目

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。

数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。

示例 1:

输入:nums = [4,6,7,7]
输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]

解题思路

  • 这题需要注意的是,不能对原数组进行排序,之前的去重思路不可行。
  • 使用set记录已经使用过的数字,每次递归进行一次查询判断,如果有,则跳过
    在这里插入图片描述

代码

class Solution {
private:
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& nums, int startIndex) {
        if (path.size() > 1) {
            result.push_back(path);
            // 注意这里不要加return,要取树上的节点
        }
        unordered_set<int> uset; // 使用set对本层元素进行去重
        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();
        }
    }
public:
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        result.clear();
        path.clear();
        backtracking(nums, 0);
        return result;
    }
};

46.全排列

题目

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

解题思路

  • 首先排列是有序的,也就是说 [1,2] 和 [2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方。所以处理排列问题就不用使用startIndex了。
  • 但排列问题需要一个used数组,标记已经选择的元素,如图橘黄色部分所示:
  • used数组,其实就是记录此时path里都有哪些元素使用了,一个排列里一个元素只能使用一次。

在这里插入图片描述

代码

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; // path里已经收录的元素,直接跳过
            // 集合的每个数据的位置对应数组的下标,使用下标+bool的形式,可以很便捷的记录是否用过
            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;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kubernetes中PV和PVC的几种状态类型

文章目录 1、PV和PVC概念1.1、PV1.2、PVC 2、PV / PVC的关系3、PV / PVC的状态类型3.1. Available&#xff08;可用&#xff09;3.2. Bound&#xff08;已绑定&#xff09;3.3. Released&#xff08;已释放&#xff09;3.4. Pending&#xff08;待定&#xff09;3.5. Failed&am…

关于UDP协议

UDP协议是基于非连接的发送数据就是把数据包简单封装一下&#xff0c;然后从网卡发出去就可以&#xff0c;数据包之间没有状态上的联系&#xff0c;UDP处理方式简单&#xff0c;所以性能损耗非常少&#xff0c;对于CPU、内存资源的占用远小于TCP&#xff0c;但是对于网络传输过…

设计编程网站集:生活部分:饮食+农业,植物(暂记)

这里写目录标题 植物相关综合教程**大型植物&#xff1a;****高大乔木&#xff08;Trees&#xff09;&#xff1a;** 具有坚硬的木质茎&#xff0c;通常高度超过6米。例如&#xff0c;橡树、松树、榉树等。松树梧桐 **灌木&#xff08;Shrubs&#xff09;&#xff1a;** 比乔木…

旧版本navicat更换颜色/护眼背景(利用regedit注册表编辑器 )

navicat默认的背景颜色是白色的&#xff0c;新版本可以如图直接在工具选项里面设置&#xff0c;可以先检查一下&#xff0c;如果没有相关设置&#xff0c;如果没有再往后看解决方法 另外&#xff0c;还可以安装其他护眼软件&#xff0c;但 若是设置里没有这个选项&#xff0c;…

webgl canvas系列——快速加背景、抠图、加水印并下载图片

文章目录 ⭐前言⭐canvas绘制图片&#x1f496;绘制csdn图片&#x1f496;给png图片加背景&#x1f496;cavans下载图片&#x1f496;cavans上传图片并抠图&#x1f496;cavans添加文字水印&#x1f496;inscode 完整代码块 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#x…

mysql性能调优

mysql性能调优 sysbench压测调优到百万级别qps sysbench压测调优到百万级别qps 这篇文章https://www.percona.com/blog/millions-queries-per-second-postgresql-and-mysql-peaceful-battle-at-modern-demanding-workloads/#:~:textWe%20contacted%20SysBench%20author%20Alex…

抖音,剪映,TikTok,竖屏短视频转场pr模板视频素材

120个叠加效果视频转场过渡素材&#xff0c;抖音,剪映,TikTok,短视频转场pr模板项目工程文件。 效果&#xff1a;VHS、光效、胶片、霓虹灯闪光、X射线、信号、老电影等。 适用软件&#xff1a;Adobe Premiere Pro 2018 12.0或更高版本。 视频素材与大多数应用程序兼容&#xff…

ES高可用

分布式搜索引擎ES 分布式搜索引擎ES1.数据聚合1.1.聚合的种类1.2.DSL实现聚合1.3.RestAPI实现聚合 2.自动补全2.1.拼音分词器2.2.自定义分词器2.3.自动补全查询2.4.实现酒店搜索框自动补全 3.数据同步思路分析 4.集群4.1 ES集群相关概念4.2.集群脑裂问题4.3.集群分布式存储4.4.…

Diff算法详解

简要了解 Diff 算法目的就是找出新旧虚拟dom差异&#xff0c;最小化更新视图&#xff1b;即本质就是比较两个JS对象的差异&#xff1b;并不是页面上所有的更新都需要Diff算法。 在了解Diff算法之前&#xff0c;我们首先需要了解一下什么是虚拟DOM。 虚拟DOM 虚拟DOM是表示真实…

iSAM2 部分状态更新算法 (I - 原理解读)

Title: iSAM2 部分状态更新算法 (I-原理解读) 文章目录 I. 前言II. 部分状态的更新 (Partial State Update)III. 因子图的线性化 (Linearization of Factor Grahps)1. 简单实例的设定2. 一个线性化计算3. 其他线性化计算4. 状态更新量说明 IV. 部分 QR 分解实现变量消元 (Elimi…

基于傅里叶描述子的手势动作识别,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…

什么是智慧公厕?智慧公厕打造公共厕所信息化应用基座

公共厕所一直以来都是城市管理的一项重要工作&#xff0c;而随着科技的发展&#xff0c;智慧公厕成为了城市管理的新方向。智慧公厕应用基座是利用物联网、互联网、大数据、云计算和自动化控制等技术&#xff0c;将公共厕所进行全方位的信息化、数字化和智慧化升级&#xff0c;…

训练YOLOv9-S

1. YOLOv9-S网络结构 1.1 改前改后的网络结构&#xff08;参数量、计算量&#xff09;对比 修改前调用的yolo.py测试的yolov9.yaml的打印网络情况&#xff0c;包含参数量、计算量 修改后调用的yolo.py测试的yolov9.yaml的打印网络情况&#xff0c;包含参数量、计算量 1.2 …

JAVA入门第一步

学习总结&#xff1a; 打开CMD常见的CMD命令 一、打开CMD CMD的概念 CMD是Windows操作系统中的命令提示符(Command Prompt)程序&#xff0c;它是一种命令行工具&#xff0c;可以让用户通过键入命令来与计算机进行交互。CMD是Windows中一个基本的系统组件&#xff0c;它提供了一…

Python学习:元组

Python 元组概念 Python 中的元组&#xff08;tuple&#xff09;是不可变的有序集合。它是一种数据类型&#xff0c;类似于列表&#xff08;list&#xff09;&#xff0c;但在创建后不能被修改。元组使用圆括号 () 来表示&#xff0c;其中的元素可以是任意类型&#xff0c;并且…

【C++ STL】string类最全解析(什么是string?string类的常用接口有哪些?)

目录 一、前言 二、什么是 string ? &#x1f4a6; string 类的基本概念 &#x1f4a6; string 类与 char * 的区别 &#x1f4a6; string 类的作用 &#x1f4a6; 总结 三、string 的常用接口详解 &#x1f4a6;string 类对象的默认成员函数 ① 构造函数(初始化) ② 赋值…

详解python中函数的参数传递

在这个用例中&#xff0c;我们要讨论的是关于函数的传参问题 我所使用的python版本为3.3.2 对于函数: def fun(arg):print(arg)def main():fun(hello,Hongten)if __name__ __main__:main() 当我们传递一个参数给fun()函数&#xff0c;即可打印出传递的参数值信息。 这里打印…

扫码签到效果如何制作?二维码签到表的制作技巧

一般参加活动或者会议时&#xff0c;都会需要在入口处签到登记之后才可进入&#xff0c;这种方式需要耗费大量的时间&#xff0c;而且带给参与者的体验也不好。面对这个问题&#xff0c;现在会通过签到二维码的方式来解决&#xff0c;只需要扫描二维码就可以在手机上登记信息&a…

c语言--字符转换函数(tolower、toupper.)

目录 一、前言二、使用举例 一、前言 C语⾔提供了2个字符转换函数&#xff1a; int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写 int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写二、使用举例 #include <ctype.h> #include<stdio.h> int main(…

go|sync系列:WaitGroup、Once、Cond

文章目录 sync.WaitGroup使用方式底层原理AddDoneWait总结 sync.Once存在的意义使用方式第一个例子&#xff0c;开启十个协程利用once运行同一个函数第二个例子&#xff0c;懒汉单例获取配置文件 底层原理存在的问题改进sync.Once解决问题 sync.Cond使用方式底层原理 参考文章 …