news 2026/4/14 16:30:47

【每日算法】LeetCode 46. 全排列

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【每日算法】LeetCode 46. 全排列

对前端开发者而言,学习算法绝非为了“炫技”。它是你从“页面构建者”迈向“复杂系统设计者”的关键阶梯。它将你的编码能力从“实现功能”提升到“设计优雅、高效解决方案”的层面。从现在开始,每天投入一小段时间,结合前端场景去理解和练习,你将会感受到自身技术视野和问题解决能力的质的飞跃。------ 算法:资深前端开发者的进阶引擎

LeetCode 46. 全排列

1. 题目描述

给定一个不含重复数字的整数数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。

示例:

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

约束条件:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums中的所有整数互不相同

2. 问题分析

2.1 问题本质

全排列问题是计算机科学中的经典回溯问题,要求生成给定集合中所有元素的所有可能排列。对于n个不同元素,共有n!种排列。

2.2 前端场景关联

  1. 路由权限配置:根据用户角色动态生成不同的页面访问路径组合
  2. 数据可视化:多维数据的展示顺序排列
  3. 表单组合:动态表单字段的展示顺序管理
  4. 商品推荐:多商品在多位置的推荐位排列

3. 解题思路

3.1 核心思路对比

方法时间复杂度空间复杂度是否最优解
回溯法(路径记录)O(n×n!)O(n)
交换法(原地交换)O(n×n!)O(n)

最优解推荐:回溯法(路径记录)是最直观且易于理解的方法,适合面试和实际开发。

3.2 算法思路详解

3.2.1 回溯法(路径记录)

使用深度优先搜索(DFS)构建排列树,通过used数组记录已使用的元素,path数组记录当前路径。

3.2.2 交换法(原地交换)

通过在原数组上交换元素位置来生成排列,减少空间使用。

4. 代码实现

4.1 回溯法(路径记录)- 最优解

/** * 回溯法解决全排列问题 * @param {number[]} nums * @return {number[][]} */constpermute=function(nums){constresult=[];// 存储所有排列结果constused=newArray(nums.length).fill(false);// 标记元素是否使用过constpath=[];// 当前路径/** * 回溯函数 * @param {number[]} path - 当前路径 * @param {boolean[]} used - 使用标记数组 */constbacktrack=(path,used)=>{// 终止条件:路径长度等于数组长度if(path.length===nums.length){result.push([...path]);// 深拷贝当前路径return;}// 遍历所有选择for(leti=0;i<nums.length;i++){// 跳过已使用的元素if(used[i])continue;// 做选择used[i]=true;path.push(nums[i]);// 递归进入下一层backtrack(path,used);// 撤销选择(回溯)path.pop();used[i]=false;}};backtrack(path,used);returnresult;};// 测试用例console.log(permute([1,2,3]));// 输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

4.2 交换法(原地交换)- 空间优化版

/** * 交换法解决全排列问题 * @param {number[]} nums * @return {number[][]} */constpermuteSwap=function(nums){constresult=[];/** * 交换法回溯 * @param {number} start - 当前交换起始位置 */constbacktrack=(start)=>{// 当起始位置到达数组末尾,找到一个排列if(start===nums.length){result.push([...nums]);// 深拷贝当前数组return;}// 从start位置开始,将每个元素交换到start位置for(leti=start;i<nums.length;i++){// 交换元素[nums[start],nums[i]]=[nums[i],nums[start]];// 递归处理下一个位置backtrack(start+1);// 恢复交换(回溯)[nums[start],nums[i]]=[nums[i],nums[start]];}};backtrack(0);returnresult;};// 测试用例console.log(permuteSwap([1,2,3]));

5. 复杂度对比

实现方法时间复杂度空间复杂度优点缺点
回溯法(路径记录)O(n×n!)O(n)直观易懂,易于调试需要used数组额外空间
交换法(原地交换)O(n×n!)O(1)额外空间空间效率高破坏原数组顺序,逻辑稍复杂

复杂度说明

  • 时间复杂度:O(n×n!),因为共有n!种排列,每种排列需要O(n)时间构建
  • 空间复杂度:O(n),主要用于递归调用栈和路径存储

6. 总结与前端应用场景

6.1 核心总结

  1. 回溯法是解决排列组合问题的通用模板,掌握此模板可解决一大类问题
  2. 空间与时间的权衡:交换法空间更优,但回溯法更通用
  3. 递归+回溯是深度优先搜索的典型应用

6.2 前端实际应用场景

6.2.1 动态路由权限控制
// 根据用户权限动态生成路由排列组合functiongenerateRoutePermutations(routes,userPermissions){constavailableRoutes=routes.filter(route=>userPermissions.includes(route.permission));// 生成所有可能的页面访问顺序returnpermute(availableRoutes.map(r=>r.path));}
6.2.2 可视化图表配置
// 多个图表组件的展示顺序排列constchartComponents=['lineChart','barChart','pieChart','table'];constallLayouts=permute(chartComponents);// 用于A/B测试不同布局效果
6.2.3 表单字段动态排序
// 根据用户习惯优化表单字段顺序functionoptimizeFormOrder(fields,userBehaviorData){constpermutations=permute(fields);// 根据用户行为数据选择最优排列returnfindBestPermutation(permutations,userBehaviorData);}
6.2.4 测试用例生成
// 生成参数的不同排列组合进行测试functiongenerateTestCases(params){constparamValues=Object.values(params);constpermutations=permute(paramValues);returnpermutations.map(perm=>{consttestCase={};Object.keys(params).forEach((key,index)=>{testCase[key]=perm[index];});returntestCase;});}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 11:36:54

管理案例丨华恒智信助力某大型餐饮集团绩效考核体系重构项目——以“行为规范+连带责任”双轮驱动,夯实千人员工的执行根基

【客户行业】餐饮行业、连锁服务业、劳动密集型消费行业 【问题类型】绩效考核体系落地、门店运营标准化、组织执行力提升【导读】在连锁餐饮行业狂飙突进的时代&#xff0c;规模的扩张往往先于管理能力的构建。当门店数量激增、员工突破千人时&#xff0c;许多企业会突然发现&…

作者头像 李华
网站建设 2026/4/11 18:39:09

MCP续证冲刺阶段,如何用3步完成考试预约并确保一次通过?

第一章&#xff1a;MCP续证考试预约概述 Microsoft Certified Professional&#xff08;MCP&#xff09;认证持有者在证书即将到期前&#xff0c;可通过参加续证考试来维持认证的有效性。续证考试不仅评估技术人员对最新技术栈的掌握程度&#xff0c;也确保其技能与当前企业IT环…

作者头像 李华
网站建设 2026/4/12 4:07:24

【MCP SC-400安全加固必备】:7个专业级漏洞修复步骤全公开

第一章&#xff1a;MCP SC-400安全漏洞修复概述MCP SC-400 是微软认证保护&#xff08;Microsoft Certified Protection&#xff09;系统中的关键安全控制协议之一&#xff0c;用于保障云环境中敏感数据的完整性与访问控制。近期发现该协议在身份验证流程中存在权限提升漏洞&am…

作者头像 李华
网站建设 2026/4/12 0:23:38

量子 Agent 多语言 API 适配从入门到精通(9大常见陷阱与规避方法)

第一章&#xff1a;量子 Agent 多语言 API 适配概述在构建跨语言、跨平台的量子计算应用时&#xff0c;量子 Agent 作为核心调度与通信组件&#xff0c;需支持多种编程语言通过统一接口访问底层量子资源。多语言 API 适配的目标是屏蔽底层实现差异&#xff0c;提供一致的调用语…

作者头像 李华
网站建设 2026/3/27 8:12:53

NFC硬件标签开发应用 包含微信小程序唤醒

最近我们硬件设备需要增加类似支付宝的碰一碰功能 ,相对扫码 碰一碰感觉更快捷。 随意,查阅资料 实践下,记录下 网上标签很多种,微信支持其中一个种可以唤醒拉起小程序的(这里安卓是可以直接跳小程序,ios由于微信只给出提示消息标签,再由标签跳转) NTAG213/215/216 类…

作者头像 李华
网站建设 2026/4/9 6:25:58

9、Linux文本查看全攻略

Linux文本查看全攻略 1. 文本查看基础 在Linux系统中,处理文本是一项常见且重要的任务。文本文件有多种格式,如英文文本、C语言代码、保存的电子邮件或HTML文件等。如果不确定文件内容是否为文本,可以使用 file 命令来判断。 1.1 分页查看文本 less 是一个常用的分页…

作者头像 李华