【练习】【类似于子集问题】力扣491. 非递减子序列/递增子序列

题目

  1. 非递减子序列

给你一个整数数组 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]]

示例 2:

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

输出:[[4,4]]

来源:力扣491. 非递减子序列


思路(注意事项)

  1. 用数组记录同一层是否有重复的元素
  • !path.empty()才可以保证有path.back()
  • 至于为什么回溯的时候没有将标记重置回0,是因为要求同一层不能有重复的元素,如果重置0,则后续元素判断时,会忘记之前是否有与其相等的元素。
  1. 用哈希表记录同一层是否有重复的元素

纯代码1

class Solution {
private:vector<vector<int>> ans;vector<int> path;void backtracking (vector<int>& nums, int start){if (path.size() >= 2) ans.push_back(path);vector<int> tmp(201, 0); // [-100,100]for (int i = start; i < nums.size(); i ++){if (!path.empty() && nums[i] < path.back() || tmp[100 + nums[i]] == 1) continue;tmp[100 + nums[i]] = 1;path.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();}}
public:vector<vector<int>> findSubsequences(vector<int>& nums) {backtracking (nums, 0);return ans;}
};

题解1(加注释)

class Solution {
private:vector<vector<int>> ans;  // 存储所有符合条件的子序列vector<int> path;         // 存储当前递归路径中的子序列// 回溯函数,用于生成所有非递减子序列void backtracking(vector<int>& nums, int start) {// 如果当前路径中的子序列长度大于等于 2,将其加入结果if (path.size() >= 2) ans.push_back(path);// 使用临时数组 tmp 去重,确保同一层级中不会重复选择相同的元素vector<int> tmp(201, 0);  // 数组大小为 201,覆盖范围 [-100, 100]// 遍历数组,从 start 开始for (int i = start; i < nums.size(); i++) {// 如果 path 不为空且当前元素小于 path 的最后一个元素,跳过(确保子序列非递减)// 或者当前元素已经在本层级使用过,跳过(去重)if (!path.empty() && nums[i] < path.back() || tmp[100 + nums[i]] == 1) continue;// 标记当前元素为已使用tmp[100 + nums[i]] = 1;// 将当前元素加入路径path.push_back(nums[i]);// 递归调用,处理下一个元素backtracking(nums, i + 1);// 回溯:移除当前元素,尝试其他可能性path.pop_back();}}public:// 主函数,生成所有非递减子序列vector<vector<int>> findSubsequences(vector<int>& nums) {// 从索引 0 开始回溯backtracking(nums, 0);// 返回所有符合条件的子序列return ans;}
};

纯代码2

class Solution {
private:vector<vector<int>> ans;vector<int> path;void backtracking (vector<int>& nums, int start){if (path.size() >= 2) ans.push_back(path);unordered_set<int> st;for (int i = start; i < nums.size(); i ++){if (!path.empty() && nums[i] < path.back() || st.find (nums[i]) != st.end()) continue;st.insert (nums[i]);path.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();}}
public:vector<vector<int>> findSubsequences(vector<int>& nums) {backtracking (nums, 0);return ans;}
};

题解2(加注释)

class Solution {
private:vector<vector<int>> ans;  // 存储所有符合条件的子序列vector<int> path;         // 存储当前递归路径中的子序列// 回溯函数,用于生成所有非递减子序列void backtracking(vector<int>& nums, int start) {// 如果当前路径中的子序列长度大于等于 2,将其加入结果if (path.size() >= 2) ans.push_back(path);// 使用哈希集合 st 去重,确保同一层级中不会重复选择相同的元素unordered_set<int> st;// 遍历数组,从 start 开始for (int i = start; i < nums.size(); i++) {// 如果 path 不为空且当前元素小于 path 的最后一个元素,跳过(确保子序列非递减)// 或者当前元素已经在本层级使用过,跳过(去重)if (!path.empty() && nums[i] < path.back() || st.find(nums[i]) != st.end()) continue;// 将当前元素加入哈希集合,标记为已使用st.insert(nums[i]);// 将当前元素加入路径path.push_back(nums[i]);// 递归调用,处理下一个元素backtracking(nums, i + 1);// 回溯:移除当前元素,尝试其他可能性path.pop_back();}}public:// 主函数,生成所有非递减子序列vector<vector<int>> findSubsequences(vector<int>& nums) {// 从索引 0 开始回溯backtracking(nums, 0);// 返回所有符合条件的子序列return ans;}
};

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

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

相关文章

本地部署AI模型 --- DeepSeek(二)---更新中

目录 FAQ 1.Failed to load the model Exit code: 18446744072635812000 FAQ 1.Failed to load the model Exit code: 18446744072635812000 问题描述&#xff1a; &#x1f972; Failed to load the model Error loading model. (Exit code: 18446744072635812000). Unkn…

开源嵌入式实时操作系统uC/OS-II介绍

一、uC/OS-II的诞生&#xff1a;从开源实验到行业标杆 背景与起源 uC/OS-II&#xff08;Micro-Controller Operating System Version II&#xff09;诞生于1992年&#xff0c;由嵌入式系统先驱Jean J. Labrosse开发。其前身uC/OS&#xff08;1991年&#xff09;最初作为教学工…

Starlink卫星动力学系统仿真建模第七讲-卫星姿轨控系统(Attitude and Orbit Control System, AOCS)设计规范

以下是一份卫星姿轨控系统&#xff08;Attitude and Orbit Control System, AOCS&#xff09;设计规范的框架和核心内容示例&#xff0c;供参考&#xff1a; 卫星姿轨控系统&#xff08;AOCS&#xff09;设计规范 1. 总则 1.1 目的 本规范旨在规定卫星姿轨控系统的设计要求、…

C++之旅-C++11的深度剖析(1)

目录 前言/背景 1.C11的发展历史 2.列表初始化 2.1 C98传统的{} 2.2 C11中的{} 2.3 C11中的std::initializer_list 3.右值引用 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延长生命周期 3.4 左值和右值的参数匹配 结束语 前言/背景 随着现代软件开发的快速发展…

什么是手机9008模式?如何进入9008

之前给大家分享了一些有关手机刷机的知识&#xff0c;今天给大家讲一讲如果刷机过程中不慎变砖应该如何应对&#xff08;当然了&#xff0c;希望大家都不会遇到&#xff09;&#x1f602;&#x1f604; 在给手机 Root 或刷机时&#xff0c;线刷 9008 指的是利用 高通 9008 模式…

单机上使用docker搭建minio集群

单机上使用docker搭建minio集群 1.集群安装1.1前提条件1.2步骤指南1.2.1安装 Docker 和 Docker Compose&#xff08;如果尚未安装&#xff09;1.2.2编写docker-compose文件1.2.3启动1.2.4访问 2.使用2.1 mc客户端安装2.2创建一个连接2.3简单使用下 这里在ubuntu上单机安装一个m…

怎么在Github上readme文件里面怎么插入图片?

环境&#xff1a; Github 问题描述&#xff1a; 怎么在Github上readme文件里面怎么插入图片&#xff1f; https://github.com/latiaoge/AI-Sphere-Butler/tree/master 解决方案&#xff1a; 1.相对路径引用 上传图片到仓库 将图片文件&#xff08;如 .png/.jpg&#xff…

Elasticsearch除了用作查找以外,还能可以做什么?

前言 Elasticsearch用于实时数据分析、日志存储、业务智能等。还有日志与监控、多租户和安全性。以及应用场景包括日志分析、公共数据采集、全文搜索、事件数据、数据可视化。处理错误拼写和支持变体&#xff0c;不过这些可能还是属于搜索优化。企业搜索、日志管理、应用监控、…

AIGC(生成式AI)试用 22 -- 跟着清华教程学习 - DeepSeek:从入门到精通

目标&#xff1a; 跟着清华教程学习DeepSeek同样的问题分别尝试使用DeepSeek和文心一言进行提问尝试使用辅助工具完成学习中遇到的问题 个人理解&#xff1a; - AI&#xff0c;AI思维&#xff0c;像人一样思考&#xff0c;越来越像人&#xff1f;参考数据宏大&#xff0c;思考…

[Windows] 全国油价实时查询,可具体到城市

[Windows] 全国油价实时查询&#xff0c;可具体到城市 链接&#xff1a;https://pan.xunlei.com/s/VOJnS3aOPeBwGaSvS0O0E1hwA1?pwdx83j# 出于代码练习的目的&#xff0c;调用公共免费api做的py程序&#xff0c;已经一键打包&#xff0c;双击启动即可 使用&#xff1a;选择…

【并发编程】线程池任务抛异常会怎么样?

一、先说结论 得看线程池的实现&#xff0c;JUC 的线程池&#xff08;ThreadPoolExecutor&#xff09;的话 不会影响其他的线程若是 submit 方法&#xff0c;或者任务为 future 任务&#xff0c;异常只有在 get 的时候才会抛出若是 execute runnable 任务&#xff0c;异常就…

本地部署deepseek-r1 ollama+anythingllm

本期笔者带给大家部署一个本地私有化知识库&#xff0c;简单明了&#xff0c;直接步入主题&#xff0c;需要读者可以继续关注支持一下啊&#xff01; 目录 背景步骤 一、环境准备二、Ollama环境部署三、AnythingLLM安装 总结 开始下载应用&#xff1a; 操作系统&#xff1a…

JAVA-Exploit编写(13-15)--JAVAFX-GUI检测工具编写实现

目录 一,JAVAFX-GUI单个漏洞检测编写 1.1 绑定事件 1.2 Thinkphp5_Rce编写 1.3 编写利用类 1.4 Thinkphp2x_Rce编写 1.5 单个漏洞检测GUI工具完整代码 二,JAVAFX-GUI单个漏洞批量检测编写 2.1 编写利用反射类 2.2 批量检测漏洞完整GUI工具代码 三,JAVAFX-GUI…

mysql-Innodb记录结构深度解析

Innodb记录结构 InnoDB记录结构深度解析一、InnoDB存储基础单元&#xff1a;页&#xff08;Page&#xff09;二、行格式&#xff08;Row Format&#xff09; 三、核心行格式详解1. Compact行格式结构组成&#xff1a; 2. Redundant行格式&#xff08;兼容旧版本&#xff09;核心…

Deepin(Linux)安装MySQL指南

1.下载 地址&#xff1a;https://downloads.mysql.com/archives/community/ 2.将文件解压到 /usr/local 目录下 先cd到安装文件所在目录再解压&#xff0c;本机是cd /home/lu01/Downloads sudo tar -xvJf mysql-9.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local3.创建软链…

ZT9 游游的字母翻倍

描述 游游拿到了一个长度为n的字符串&#xff0c;她每次操作会选择一个区间[l,r]&#xff0c;将第l个字母到第r个字母各重复一次&#xff0c;插入到该字母的后面。 例如&#xff0c;对于字符串"abcd"&#xff0c;若选择区间[2,3]进行操作&#xff0c;字符串将变成&qu…

Visual Studio更新说明(关注:.NET+AI生产力)

Ver V0.0&#xff1a;Visual Studio 2022 v17.12更新:.NET9AI生产力 AI插件推荐 &#xff08;1&#xff09;腾讯云AI代码手&#xff08;内含了DeepSeek-R1&#xff09;&#xff0c;目前免费&#xff0c;但收费我也可能会买。 AI插件!推荐 &#xff08;1&#xff09;百度的…

C++ 设计模式-访问者模式

C++访问者模式 一、模式痛点:当if-else成为维护噩梦 开发动物园管理系统,最初的需求很简单: class Animal {}; class Cat : public Animal {}; class Dog : public Animal {};// 处理动物叫声 void makeSound(Animal* a) {if (auto c = dynamic_cast<Cat*>(a)) {st…

QEMU源码全解析 —— 内存虚拟化(17)

接前一篇文章:QEMU源码全解析 —— 内存虚拟化(16) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 QEMU内存管理模型

java基于数组实现队列(四)

概述 实现我上一篇博客中提到的 实际上&#xff0c;就是用synchronized代码块解决线程安全问题&#xff0c;以及利用wait()、notify()实现线程阻塞、唤醒。 实现 pollV3() private Object lockBySynchronizednew Object();public int pollV3() {synchronized (lockBySynchr…