Leetcode:491. 递增子序列(C++)

news/2024/11/16 20:38:41/

目录

问题描述:

实现代码与解析:

回溯:

原理思路:

优化版:

原理思路:


问题描述:

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

实现代码与解析:

回溯:

class Solution {
public:vector<int> path;//记录路径vector<vector<int>> result;//记录结果void backtracking(vector<int> nums,int startIndex){//至少有两个元素if(path.size()>=2){result.push_back(path);}unordered_set<int> used;//记录本层使用过的数,去重for(int i=startIndex;i<nums.size();i++){//和上一个数比较,若小于,或与前面成功循环的数相同,则跳过此次循环,去重if((!path.empty()&&nums[i]<path.back())||used.find(nums[i])!=used.end()) continue;used.insert(nums[i]);path.push_back(nums[i]);//处理backtracking(nums,i+1);//递归path.pop_back();//回溯}return;}vector<vector<int>> findSubsequences(vector<int>& nums) {   backtracking(nums,0);return result;}
};

原理思路:

        首先就是保证得到结果递增,我们在非第一个数时判断是否大于等于前一个数即可,若小于则跳过此次循环,进行下一次循环。

        然后,此题与其他递归题不同的是,此题不能和其他回溯题一样来用排序去重,此题的顺序是规定不能变的,所以我们去重的话,就设置一个哈希表set来记录当前层用过的数,若发现已经用过,则跳过此层循环。

unordered_set<int> used;//记录本层使用过的数,去重
//和上一个数比较,若小于,或与前面成功循环的数相同,则跳过此次循环,去重
if((!path.empty()&&nums[i]<path.back())||used.find(nums[i])!=used.end()) continue;

        最后,注意一下要记录用过的数,还有这里要记录每一个结点的结果,不要在记录结果时就返回掉了。

//至少有两个元素
if(path.size()>=2)
{result.push_back(path);
}

优化版:

class Solution {
public:vector<int> path;//记录路径vector<vector<int>> result;//记录结果void backtracking(vector<int> nums,int startIndex){//至少有两个元素if(path.size()>=2){result.push_back(path);}int used[201]={0};//记录本层使用过的数,去重for(int i=startIndex;i<nums.size();i++){//和上一个数比较,若小于,或与前面成功循环的数相同,则跳过此次循环,去重if((!path.empty()&&nums[i]<path.back())||used[nums[i]+100]==1) continue;used[nums[i]+100]=1;//等于1说明被用过了path.push_back(nums[i]);//处理backtracking(nums,i+1);//递归path.pop_back();//回溯}return;}vector<vector<int>> findSubsequences(vector<int>& nums) {   backtracking(nums,0);return result;}
};

原理思路:

        就是把哈希表set换成了数组而已,因为这里给了数的范围,数少用数组会快一点。


http://www.ppmy.cn/news/19636.html

相关文章

3000字英文随笔(挽救下语感)

&#x1f33c;遥远的她(吉他版) - 張子铭 - 单曲 - 网易云音乐 &#x1f33c;New Boy - 房东的猫/陈婧霏 - 单曲 - 网易云音乐 实际只有800个单词哈 我会借助有道词典&#xff0c;百度翻译 结合所剩不多的语感&#xff0c;尽己所能地道地表达 杜绝中式英语&#xff0c;当…

RK3399平台开发系列讲解(文件系统篇)文件回写过程介绍

🚀返回专栏总目录 文章目录 一、编程接口二、回写过程2.1、周期回写2.2、强制回写2.3、系统调用sync沉淀、分享、成长,让自己和他人都能有所收获!😄 📢进程写文件时,内核的文件系统模块把数据写到文件的页缓存,没有立即写回到存储设备。文件系统模块会定期把脏页(即…

【时间复杂度和空间复杂度】

1.时间复杂度时间复杂度的定义&#xff1a;在计算机科学中&#xff0c;算法的时间复杂度是一个数学函数&#xff0c;它定量描述了该算法的额外运行时间。一个算法执行所耗费的时间&#xff0c;从理论上说&#xff0c;是不能算出来的&#xff0c;只有你把你的程序放在机器上跑起…

JavaScript 语句

JavaScript 语句 我们可以使用设置语言来告诉浏览器需要做些什么事情&#xff0c;语句就是向浏览器发出一些命令。 那么JavaScript中怎样定义语句呢? 首先语句是用来给浏览器发送命令的。命令是用来告诉浏览器该做哪些事情的。 举例说明&#xff0c;我们想idtest的元素中设…

K8s:通过 Helmify 实现将 YAML 文件 转化为 Helm Charts

写在前面 分享一个 Yaml 资源文件转 Helm Charts 包的小工具 helmify博文内容涉及&#xff1a;helmify 工具安装&#xff0c;简单使用YAML 静态文件转化为 HELM charts 包从 kustomize 输出转化为 Helm理解不足小伙伴帮忙指正博文涉及 helmify 我心匪石&#xff0c;不可转也。我…

C语言深度解剖-关键字(1)

目录 1.初步了解关键字 2.第一个C程序 3.深刻理解变量 是什么&#xff1f; 怎么用&#xff1f; 为什么&#xff1f; 4.深刻理解定义与声明 5.auto关键字的理解 6.理解关键字register 认识&#xff1a; 本质&#xff1a; register 修饰变量 写在最后&#xff1a; 1…

Python装饰器使用方法详解

文章目录1 装饰器背景知识1.1 基本概念1.2 应用场景2 简单的装饰器代码3 使用装饰器记录函数执行次数4 带参数的装饰器5 装饰器处理有返回值的函数1 装饰器背景知识 1.1 基本概念 装饰器&#xff08;Decorator&#xff09;是 Python 中一种函数或类&#xff0c;用来修饰其他函…

Redis消息队列 | 黑马点评

目录 一、认识消息队列 二、List模拟消息队列 三、PubSub的消息队列 四、Stream的消息队列&#xff08;重点&#xff09; 1、单消费模式 2、消费者组 五、redis三种消息队列对比 六、优化秒杀实战 1、创建消息队列 2、修改下单脚本 3、接收消息处理 一、认识消息队列 …