[路飞]_leetcode-491-递增子序列

简介: leetcode-491-递增子序列

网络异常,图片无法展示
|


「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战


[题目地址][B站地址]


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


解题思路


首先我们观察示例1 的答案可以看到,本题的递增子序列,并不是严格递增,后面的元素是可以等于前面的元素的。


第二点,是关于本题的提示,如果含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。这句话的意思其实是说我们的答案中,不允许有重复的元素。比如前面的 4,6 可以和第一个 7 组成 4,6,7,也可以和第二个 7 组成 4,6,7,但是我们的结果数组中只有一个 4,6,7,所以我们要对结果去重。


接下来我们再观察示例1 的答案可以看到,它其实就是以每一个元素为起点,向后查找递增子序列,然后将找到的递增子序列放入结果数组即可。这里我们不需要以最后一个元素为起点进行查找,是因为本题要求递增子序列中至少要有两个元素。


基于以上信息,我们就得到了本题的解题思路:


  1. 以除了最后一个元素的每一个元素为起点,向后查找符合条件的元素,组成递增子序列,并将组成的递增子序列插入结果数组。
  2. 在这个过程中,要注意有相同元素的情况,这里我们可以利用 Set 记录已经使用过的数字,如果后面找到的数字已经被使用过,则跳过。


代码实现


var findSubsequences = function(nums) {
  // 记录输入数组长度
  const len = nums.length,
  // 初始化结果数组
  res = [];
  // 根据给定子序列和开始下标,向后查找符合要求的元素,组成新的递增子序列
  function getList(arr,l){
    // 初始化 set 记录使用过的数字
    const set = new Set(),
    // 获取当前子序列最后一个元素
    end = arr[arr.length-1]
    // 遍历未处理区间
    for(let i = l;i<len;i++){
      const item = nums[i]
      // 如果当前数字使用过或者不符合要求,跳过
      if(set.has(item) || item<end) continue;
      // 否则记录该数字
      set.add(item)
      // 获取新的递增子序列
      const _arr = [...arr,item]
      // 将子序列插入结果数组
      res.push(_arr)
      // 继续查找可能的子序列
      getList(_arr,i+1)
    }
  }
  // 创建 set 记录使用过的数字
  const set = new Set();
  // 遍历输入数组,以每一个元素为起点,查找递增子序列
  for(let i = 0;i<len-1;i++){
    const item = nums[i]
    if(set.has(item)) continue
    set.add(item)
    getList([item],i+1)
  }
  // 返回结果数组
  return res;
};
复制代码


至此我们就完成了 leetcode-491-递增子序列


如有任何问题或建议,欢迎留言讨论!👏🏻👏🏻👏🏻

相关文章
|
存储 消息中间件 缓存
腾讯看点基于 Flink 的实时数仓及多维实时数据分析实践
当业务发展到一定规模,实时数据仓库是一个必要的基础服务。从数据驱动方面考虑,多维实时数据分析系统的重要性也不言而喻。但是当数据量巨大的情况下,拿腾讯看点来说,一天上报的数据量达到万亿级的规模,要实现极低延迟的实时计算和亚秒级的多维实时查询是有技术挑战的。
腾讯看点基于 Flink 的实时数仓及多维实时数据分析实践
|
搜索推荐 数据挖掘 数据安全/隐私保护
视频号小店达人带货系统开发
视频号小店达人带货系统开发是一个综合性的项目,旨在通过视频号平台为商家和达人提供一个高效、便捷的电商带货解决方案。
|
SQL 弹性计算 分布式计算
实时数仓 Hologres操作报错合集之在执行SQL查询时遇到了问题,报错原因是“Invalid index column id: 2”,该怎么处理
在使用阿里云实时数仓Hologres时,可能会遇到不同类型的错误。例如:1.内存超限错误、2.字符串缓冲区扩大错误、3.分区导入错误、4.外部表访问错误、5.服务未开通或权限问题、6.数据类型范围错误,下面是一些常见错误案例及可能的原因与解决策略的概览。
|
XML Android开发 数据格式
Fragment的使用,零基础入门android逆向视频课程
Fragment的使用,零基础入门android逆向视频课程
|
Shell Linux
Linux基础服务二进制一键安装shell脚本
Linux基础服务二进制一键安装shell脚本
303 0
|
云安全 存储 运维
阿里云ACA认证,最具价值的认证
(Apsara Clouder)技能认证是阿里云大学2017年6月推出的,轻量化、碎片化的在线学-练-考一体化模式的认证,让更多关注云计算、大数据、云安全技术的开发者们,能够快速上手了解对应的技能,并学以致用。让价值变现大数据+云计算+云安全助你得到梦想中的offer。
796 0
|
监控 项目管理 双11
支撑双11大促,阿里巴巴敏捷项目管理实践及工具落地
日常生活中,我们会接触到很多项目,但是在互联网时代,和产品相关的项目就会复杂的多,我们的项目会遇到什么样的挑战?这个过程中,我们如何应对挑战,解决问题?在2017杭州云栖大会企业高效研发实践专场上,阿里巴巴产品专家光脉,从产品的角度,分享了敏捷研发环境下,项目管理的落地实践。
5544 0
|
.NET 前端开发 开发框架
菜鸟入门【ASP.NET Core】10:Cookie-based认证实现
准备工作 新建MVC项目,然后用VSCode打开 dotnet new mvc --name MvcCookieAuthSample 在Controllers文件夹下新建AdminController.
1667 0
|
28天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
37897 151
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
10天前
|
人工智能 自然语言处理 监控
OpenClaw skills重构量化交易逻辑:部署+AI全自动炒股指南(2026终极版)
2026年,AI Agent领域最震撼的突破来自OpenClaw(原Clawdbot)——这个能自主规划、执行任务的智能体,用50美元启动资金创造了48小时滚雪球至2980美元的奇迹,收益率高达5860%。其核心逻辑堪称教科书级:每10分钟扫描Polymarket近千个预测市场,借助Claude API深度推理,交叉验证NOAA天气数据、体育伤病报告、加密货币链上情绪等多维度信息,捕捉8%以上的定价偏差,再通过凯利准则将单仓位严格控制在总资金6%以内,实现低风险高频套利。
4813 39