( 回溯算法) 491. 递增子序列 ——【Leetcode每日一题】

news/2025/1/18 12:05:11/

❓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]]

示例 2:

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

提示:

  • 1 <= nums.length <= 15
  • -100 <= nums[i] <= 100

💡思路:回溯

本题可以使用回溯求解,可以将本问题切割成很多个小部分,只考虑其中一个数,然后将剩余的数往下递归处理,可以理解成好多层,每层只加一个元素:

  • 定义一个数组 tmp 保存递增子序列,由于递增子序列中 至少有两个元素,所以只要递增子序列的长度如果大于 1 ,则是一种可能;
  • 还要考虑去重的情况,可以使用 哈希表 或者 使用数组(元素范围为[-100, 100])保存进行去重,这里使用数组:
    • 新的一层 used 都会重新定义(清空),所以要知道 used 只负责本层!

在这里插入图片描述

🍁代码:(Java、C++)

Java

class Solution {private List<List<Integer>> ans = new ArrayList<>();private List<Integer> tmp = new ArrayList<>();private void backtracking(int[] nums, int startIndex){if(tmp.size() > 1){//如果长度大于1就是一种可能ans.add(new ArrayList<>(tmp));}int[] used = new int[201];//使用数组对本层元素进行去重for(int i = startIndex; i < nums.length; i++){if((!tmp.isEmpty() && nums[i] < tmp.get(tmp.size() - 1)) || (used[nums[i] + 100] == 1)){//排除较小的数和已经使用过的数continue;}used[nums[i] + 100] = 1;// 记录这个元素在本层用过了,本层后面不能再用了tmp.add(nums[i]);backtracking(nums, i + 1);tmp.remove(tmp.size() - 1);//回溯,弹出最后一个元素,继续遍历其他可能}}public List<List<Integer>> findSubsequences(int[] nums) {backtracking(nums, 0);return ans;}
}

C++

class Solution {
private:vector<vector<int>> ans;vector<int> tmp;void backtracking(vector<int>& nums, int startIndex){if(tmp.size() > 1){//如果长度大于1就是一种可能ans.push_back(tmp);}int used[201] = {0}; //使用数组对本层元素进行去重for(int i = startIndex; i < nums.size(); i++){if((!tmp.empty() && nums[i] < tmp.back()) || used[nums[i] + 100] == 1){//排除较小的数和已经使用过的数continue;}used[nums[i] + 100] = 1;// 记录这个元素在本层用过了,本层后面不能再用了tmp.push_back(nums[i]);backtracking(nums, i + 1);tmp.pop_back();//回溯,弹出最后一个元素,继续遍历其他可能}}
public:vector<vector<int>> findSubsequences(vector<int>& nums) {backtracking(nums, 0);return ans;}
};

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n ∗ 2 n ) O(n * 2^n) O(n2n),这里枚举所有子序列的时间代价是 O ( 2 n ) O(2^n) O(2n),每次检测序列是否合法和获取哈希值的时间代价都是 O ( n ) O(n) O(n),故渐近时间复杂度为 O ( n ∗ 2 n ) O(n * 2^n) O(n2n)
  • 空间复杂度 O ( n ) O(n) O(n)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!


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

相关文章

day82【Leetcode】

文章目录 前言一、检查替换后的词是否有效&#xff08;力扣1003&#xff09;二、有效的括号&#xff08;力扣20&#xff09;【1003类似题目】每日一题&#xff1a;数青蛙&#xff08;力扣1419&#xff09; 前言 1、检查替换后的词是否有效 2、有效的括号 3、数青蛙 一、检查替…

【008】C++数据类型之重要关键字详解

C数据类型之重要关键字详解 引言一、const修饰普通变量重点说明 二、register修饰寄存器变量三、volatile强制访问内存四、sizeof测试类型的大小五、typedef关键字总结 引言 &#x1f4a1; 作者简介&#xff1a;专注于C/C高性能程序设计和开发&#xff0c;理论与代码实践结合&a…

OA系统开发能结合人工智能打造全新体系吗?

先来说一说OA系统的 项目背景&#xff1a; 某公司是一个拥有500名员工的中等规模企业&#xff0c;其业务范围涵盖销售、生产、研发等领域。随着公司规模的不断扩大&#xff0c;日常办公流程变得越来越复杂&#xff0c;员工之间的协作需求也日益增加。为了提高办公效率&#xff…

idea 调试远程docker中的spring boot 项目

开发环境 idea-2023&#xff08;放心&#xff0c;旧版本也可以远程调试&#xff09; Java版本&#xff1a;17 生产环境 docker版本&#xff1a;23.0.3 Java版本1&#xff1a;openjdk:17.0.2&#xff08;基于Java17的项目&#xff09; Java版本2&#xff1a;adoptopenjdk:…

本地项目上传到Git(Gitee)仓库

一、步骤解答&#xff08;详细图解步骤见第二大点&#xff09; 1、打开我们的项目所在文件夹&#xff0c;我们发现是不存在.git文件 2、在你的项目文件夹外层【鼠标右击】弹出菜单&#xff0c;在【鼠标右击】弹出的菜单中&#xff0c;点击【Git Bash Here】&#xff0c;弹出运…

〖Python网络爬虫实战㉘〗- Selenium案例实战(二)

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付…

小航助学GESP_C++一级模拟测试试卷(含题库答题软件账号)

GESP在线模拟训练系统请点击 电子学会-全国青少年编程等级考试真题Scratch一级&#xff08;2019年3月&#xff09;在线答题_程序猿下山的博客-CSDN博客_小航答题助手 答案:A 第1题人们在使用计算机时所提到的 Windows 通常指的是&#xff08;&#xff09;。 A、操作系统B、多…

ChatGPT 的议论文究竟写的怎么样?111 位高中教师告诉你答案

夕小瑶科技说 原创 作者 | 小戏、Python 在 OpenAI GPT-4 发布时发布的《GPT-4 Technical Report》中&#xff0c;其中很吸引人眼球的一部分是 GPT-4 应用于教育领域的出色表现&#xff0c;通过让 GPT-4 去完成美国的 AP 课程及考试&#xff0c;来评估 GPT-4 在多个学科中的性…