news 2026/6/12 1:51:11

【LeetCode刷题日记】491.递增子序列 一篇搞懂

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【LeetCode刷题日记】491.递增子序列 一篇搞懂

🔥个人主页:代码不加冰(欢迎来访)
🎬作者简介:java后端学习者
❄️个人专栏:LeetCode刷题日记 , 苍穹外卖日记,SSM框架深入,JavaWeb,
命运的结局尽可永在,不屈的挑战却不可须臾或缺!


前言:
大家好我是代码不加冰,这周过完就正式进入痛苦的期末周了,文章平时也没什么时间写,只能每天抽出一点时间刷几题算法和看看八股,没事的时候还是用cc跑了几个项目,然后跑了个自用的时间管理软件,还是挺好玩的,废话不多说,进入到我们的今日刷题环节!

摘要:

题目背景: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

题目解析:

首先题目要求:

给定一个整数数组nums,找出所有不同的递增子序列(长度至少为2)。

这里的递增指的是:

nums[i] <= nums[j]

注意:

  • 不是连续子数组
  • 是子序列,可以跳过元素
  • 结果不能有重复序列
  • 但是数组中可以有重复的元素

我们一眼看出来是回溯类型的题目,和我们前面做的子集问题类似,但是去重的思路不一样。


本质区别总结

力扣90:子集

可以排序 排序后: 重复元素连续 树层去重: if(i > startIndex && nums[i] == nums[i-1]) 利用排序去重

本题

不能排序 重复元素可能分散 树层去重: HashSet<Integer> used 记录本层已经使用过的数字

可以这样记:

题目是否排序去重方式
90 子集Ⅱ可以nums[i]==nums[i-1]
40 组合总和Ⅱ可以nums[i]==nums[i-1]
47 全排列Ⅱ可以nums[i]==nums[i-1] + used[]
491 递增子序列不能HashSet树层去重

所以,这道题目不能排序,题目要的是递增的子序列,如果对原来的数组进行排序,结果就完全不一样了,

例如

{1,3,5,4}
结果:[1,3],[1,5],[1,4],[3,5],[3,4],[1,3,5],[1,3,4]

{5,3,4,1}

结果:[[3,4]]

这两个的结果完全不一样。


回溯三部曲
参数

需要知道:

当前遍历到哪里 当前路径

因此:

backtracking(nums,startIndex)

终止条件

题目要求:

长度 >= 2

所以:

path.size() >= 2

就加入结果集。注意:这里不能 return。因为后面可能还能继续选。

例如:

[4,6]

还能扩展成:

[4,6,7]

所以:

if(path.size() >= 2){ result.add(...) }

继续向下搜索。


单层搜索逻辑

遍历当前位置后面的所有元素:

for(int i=startIndex;i<nums.length;i++)

如何保证递增

当前数字:

nums[i]

要大于等于路径最后一个数字:

nums[i] >= path最后一个元素

否则跳过:

if(!path.isEmpty() && nums[i] < path.get(path.size()-1)) { continue; }

本题最大难点:去重

看看这个例子:

[4,6,7,7]

假设第一层:

4 6 7 7

如果两个 7 都选:

[4,7]

会出现两次。因此:

同一树层不能出现相同数字
同一树枝可以

例如:

[7,7]

是合法答案。


树层去重

使用 HashSet

每一层创建一个:

HashSet<Integer> used = new HashSet<>();

如果本层已经出现:

used.contains(nums[i])

直接跳过:

if(used.contains(nums[i])){ continue; }

然后记录:

used.add(nums[i]);

为什么不能全局 HashSet

例如:

[7,7]

第一个7用了。

第二个7如果全局去重:

直接被过滤

结果:

[7,7]

永远出不来。所以:

只能树层去重 不能全局去重

这是本题核心。

我们可能会想:

if(i > startIndex && nums[i] == nums[i - 1]){ continue; }

90子集之所以能用

if(i > startIndex && nums[i] == nums[i - 1])

是因为题目允许先排序,排序后相同元素一定挨在一起,所以只要发现当前元素和前一个元素相同,就说明这是同一层的重复选择,可以直接跳过。

而力扣491要求求递增子序列,必须保持原数组的相对顺序,不能排序,相同元素可能分散在数组的不同位置,例如[4,7,6,7]中两个7中间隔着一个6此时nums[i] == nums[i-1]根本检测不到重复,因此90题的去重方式失效。491只能使用HashSet记录当前树层已经使用过的数字,只要这一层出现过某个数字,后面再遇到相同数字就跳过,从而实现树层去重。

简单来说:90是利用排序后“相同元素连续”的特性去重,491是利用HashSet记录“当前层出现过哪些值”去重。


题目答案:

class Solution { List<List<Integer>> result = new ArrayList<>(); LinkedList<Integer> path = new LinkedList<>(); public List<List<Integer>> subsetsWithDup(int[] nums) { Arrays.sort(nums); backtracking(nums, 0); return result; } private void backtracking(int[] nums, int startIndex) { result.add(new ArrayList<>(path)); for (int i = startIndex; i < nums.length; i++) { // 树层去重 if (i > startIndex && nums[i] == nums[i - 1]) { continue; } path.add(nums[i]); backtracking(nums, i + 1); path.removeLast(); } } }

结语:

如果对你有帮助,请点赞,关注,收藏,你的支持就是我最大的鼓励!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 1:47:08

如何快速搭建智能交易系统:面向新手的完整指南

如何快速搭建智能交易系统&#xff1a;面向新手的完整指南 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN 想要在股市中获得AI的智慧加持&#x…

作者头像 李华
网站建设 2026/6/12 1:41:59

GEO监测工具怎么选?B2B企业要看真实网页模拟能力

B2B企业做GEO&#xff0c;第一步不是马上写文章&#xff0c;也不是马上发稿&#xff0c;而是先搞清楚一件事&#xff1a;你的品牌现在在AI回答里到底是什么状态&#xff1f;客户在豆包、DeepSeek、文心一言、通义千问里提问时&#xff0c;AI会不会提到你&#xff1f;会不会推荐…

作者头像 李华
网站建设 2026/6/12 1:38:58

2026最全音频转MP3攻略!这6款格式转换工具太好用了

MP3 可以说是全网最通用的音频格式&#xff0c;手机、车载音响、蓝牙耳机、运动手表全都能兼容&#xff0c;占用内存还小。但平时我们常会遇到 NCM、KGMA、MGG、FLAC、WAV 这类专属或小众音频格式&#xff0c;换个设备根本打不开&#xff0c;没法正常播放。 想把这些"锁住…

作者头像 李华
网站建设 2026/6/12 1:35:09

Ohook技术实现:Office许可证验证拦截机制解析与部署方案

Ohook技术实现&#xff1a;Office许可证验证拦截机制解析与部署方案 【免费下载链接】ohook An universal Office "activation" hook with main focus of enabling full functionality of subscription editions 项目地址: https://gitcode.com/gh_mirrors/oh/ohoo…

作者头像 李华
网站建设 2026/6/12 1:34:37

精密机械生产成本核算专员简历高分撰写指南

不少有车间核算、物料对账经验的求职者投递无果&#xff0c;根源是简历不符合制造企业招聘筛选标准。厂家招录成本核算岗&#xff0c;看重原料降耗、工时管控、外协议价、报废损耗控制四大能力。 简历常见五类短板&#xff1a;技能杂乱堆砌&#xff0c;不分机加工、模具赛道&am…

作者头像 李华
网站建设 2026/6/12 1:34:37

字节大模型应用岗实习两小时拷打:记忆机制 + RAG 全链路,13 道题逐个答透

今天分享一篇 字节跳动大模型应用算法(实习) 的面经。整场聊了两个小时,从 Agent 的长短期记忆怎么设计,到 RAG 的每个环节为什么这么做,再到 asyncio、HyDE、SGLang vs vLLM,面试官一路追问到底,问得很细。这位同学把题目基本都还原出来了,我做了补充和校对,分享给正在准备大模…

作者头像 李华