当前位置: 首页 > article >正文

算法-js-子集

题:给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

方法一:迭代法
核心逻辑:动态扩展子集, 小规模数据(n ≤ 20)推荐

const subsets = (nums) => {const result = [[]];for (const num of nums) {const n = result.length;for (let i = 0; i < n; i++) {result.push([...result[i], num]);}}return result;
};

方法二:回溯法(DFS+剪枝)
核心逻辑:通过深度优先搜索遍历所有决策路径

const subsets = (nums) => {const result = [];const backtrack = (start, path) => {result.push([...path]); // 记录当前路径for (let i = start; i < nums.length; i++) {path.push(nums[i]);    // 选择当前元素backtrack(i + 1, path); // 递归下一层path.pop();           // 撤销选择(回溯)}};backtrack(0, []);return result;
};

方法三:递归分治法
核心逻辑:基于数学归纳法递推生成子集

const subsets = (nums) => {if (nums.length === 0) return [[]];const last = nums.pop();const prevSubsets = subsets(nums); // 递归获取前n-1元素的子集const newSubsets = prevSubsets.map(sub => [...sub, last]); return [...prevSubsets, ...newSubsets]; // 合并新旧子集
};

时间复杂度均为O(n*2^n)

场景选择建议
竞速场景:优先选择迭代法(代码最简)
复杂变体:使用回溯法(方便添加剪枝条件,如子集大小限制)
理论研究:递归法(便于数学证明)

http://www.lryc.cn/news/2394780.html

相关文章:

  • (新)MQ高级-MQ的可靠性
  • Android设置界面层级为最上层实现
  • 云原生微服务架构演进之路:理念、挑战与实践
  • Go语言使用阿里云模版短信服务
  • Leetcode 3231. 要删除的递增子序列的最小数量
  • 4.2.5 Spark SQL 分区自动推断
  • 基于昇腾MindSpeed训练加速库玩转智谱GLM-4-0414模型
  • 【图像处理入门】2. Python中OpenCV与Matplotlib的图像操作指南
  • Spring Boot微服务架构(九):设计哲学是什么?
  • GRCh38版本染色体位置转换GRCh37(hg19)
  • TC/BC/OC P2P/E2E有啥区别?-PTP协议基础概念介绍
  • 解决微信小程序中 Flex 布局下 margin-right 不生效的问题
  • Kafka数据怎么保障不丢失
  • 使用HTTPS进行传输加密
  • AI书签管理工具开发全记录(八):Ai创建书签功能实现
  • X-plore v4.43.05 强大的安卓文件管理器-MOD解锁高级版 手机平板/电视TV通用
  • 使用多Agent进行海报生成的技术方案及评估套件-P2P、paper2poster
  • Redis--缓存工具封装
  • python:在 PyMOL 中如何查看和使用内置示例文件?
  • SpringCloud——Docker
  • 机器学习:欠拟合、过拟合、正则化
  • 运用集合知识做斗地主案例
  • 《HelloGitHub》第 110 期
  • 使用 Shell 脚本实现 Spring Boot 项目自动化部署到 Docker(Ubuntu 服务器)
  • day023-网络基础与OSI七层模型
  • SpringAI系列4: Tool Calling 工具调用 【感觉这版本有bug】
  • 机器人--里程计
  • 设计模式——原型设计模式(创建型)
  • react库:class-variance-authority
  • 通过mqtt 点灯