day158—回溯—全排列(LeetCode-46)

题目描述

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

示例 1:

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

示例 2:

输入:nums = [0,1]输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]输出:[[1]]

提示:

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

解决方案:

这段代码的核心功能是生成一个数组的所有全排列(即所有元素的不同排列组合,无重复、无遗漏),采用「按位置填数 + 集合控重 + 回溯」的思路实现,整体逻辑清晰且贴合 C++ 类编程风格。

核心逻辑

  1. 成员变量作用

    • ans:最终结果数组,存储所有生成的全排列;
    • path:临时路径数组,按位置存储当前正在构造的排列(长度固定为数组长度n);
    • n:输入数组的长度,标记需要填充的位置总数。
  2. 递归函数dfs逻辑

    • 参数说明:
      • i:表示当前要填充path的第i个位置(从 0 开始);
      • s:当前可选的数字集合(保证每个位置选的数未被使用过)。
    • 终止条件:当i == n时,说明path的所有位置已填充完毕,此时path是一个完整的排列,将其加入ans后返回;
    • 核心流程(按位填数 + 集合控重):① 遍历当前可选集合s中的所有数字x;② 将x填入path的第i个位置;③ 构造新集合new_s(复制s并删除x),保证下一个位置不会重复选x;④ 递归调用dfs(i+1, new_s),填充下一个位置;⑤ 无需显式回溯(集合是值传递,新集合不影响原集合,天然实现 “选 / 不选” 的分支隔离)。
  3. 主函数permute

    • 初始化:记录数组长度n、调整path长度为n、清空ans避免残留;
    • 构造初始集合:将输入数组nums的所有元素存入init_set,作为初始可选数字;
    • 启动递归:从第 0 个位置开始调用dfs,最终返回存储所有全排列的ans

关键特点

  • 控重逻辑:通过unordered_set的 “选数后删除” 机制,保证每个位置的数字唯一,避免生成重复排列;
  • 路径管理:path按位置填充,长度固定为n,无需频繁增删,仅通过赋值更新当前位置的数字;
  • 集合值传递:s作为值参数传递,每次递归的集合都是独立拷贝,天然实现回溯(无需手动恢复集合状态)。

总结

  1. 核心思路:按位置逐个填充数字,用集合控制每个位置选 “未使用过的数字”,递归遍历所有可能的填充组合;
  2. 关键操作:集合的 “拷贝 + 删除” 是控重核心,path按位赋值是路径构造核心;
  3. 功能效果:能生成输入数组的所有全排列,无重复、无遗漏,时间复杂度为O(n!)(全排列的最优复杂度)。

以输入nums=[1,2]为例,最终会生成[[1,2],[2,1]],完全符合全排列的定义。

函数源码:

class Solution { public: // 类内成员变量:保存结果和当前路径 vector<vector<int>> ans={}; vector<int> path={}; int n; // 数组长度 void dfs(int i,unordered_set<int>s){ if (i == n) { // 所有位置填充完毕,保存结果 ans.push_back(path); return; } // 遍历当前可选的所有数字 for (int x : s) { path[i] = x; // 第i个位置填入数字x // 构造新集合:移除已选的x unordered_set<int> new_s = s; new_s.erase(x); dfs(i + 1, new_s); // 递归填充下一个位置 } } vector<vector<int>> permute(vector<int>& nums) { n = nums.size(); path.resize(n); // 初始化路径数组 ans.clear(); // 清空结果(避免多次调用时残留) // 构造初始可选集合:包含nums所有元素 unordered_set<int> init_set(nums.begin(), nums.end()); // 调用辅助函数:从第0个位置开始填充 dfs(0, init_set); return ans; } };

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1195944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

空气泵选购全指南:2026年市场、品牌与前瞻分析

空气泵,这个在实验室、医院、工厂乃至水产养殖中默默工作的设备,正经历着一场“静音革命”。走进一家现代化的环境监测实验室,您会发现,以往那些发出持续轰鸣的背景噪音源已悄然消失,取而代之的是运行声音轻柔如图…

2026年AI智能产品开发行业十大领先团队如何炼成

如何高效甄选AI智能产品开发服务商在数字化转型的浪潮中&#xff0c;AI智能产品开发已成为企业提升竞争力的关键。然而&#xff0c;面对市场上众多的服务商&#xff0c;如何选择一家靠谱、高效的合作伙伴&#xff1f;本文将从技术实力、行业案例和服务模式三个维度出发&#xf…

聚链成势:新紫光集团完成战略重构,书写科技自立新篇章

负债降低67%、连续三年营收超千亿、在超20个细分科技领域占据领先地位——这家曾经陷入破产重整的中国科技巨头,正以全新面貌重返产业舞台。2022年7月,紫光集团完成司法重整,引入智路资本和建广资产作为战略投资者,…

2026必备!9个一键生成论文工具,MBA论文写作必备!

2026必备&#xff01;9个一键生成论文工具&#xff0c;MBA论文写作必备&#xff01; AI 工具革新论文写作&#xff0c;MBA 人如何抓住先机&#xff1f; 在人工智能技术迅猛发展的今天&#xff0c;学术写作正经历一场深刻的变革。对于 MBA 学生而言&#xff0c;撰写高质量的论文…

科技赋能警校!itc保伦股份助力海南警察学院构建智慧教学新生态!

01铸魂扬帆,定海启航!海南警察学院,简称“海南警院”,是由海南省人民政府举办,海南省公安厅主管、海南省教育厅负责业务管理与指导的公办普通本科高等学校。学院坐落于海南省海口市秀英区定海大道1号,占地规模达…

uniapp踩坑-组件嵌套子组件不触发onReachBottom事件

uniapp踩坑-组件嵌套子组件不触发onReachBottom事件在 uni-app 开发中&#xff0c;相信很多人都遇到过这样的问题&#xff1a;页面嵌套了多层组件后&#xff0c;在子组件里定义的onReachBottom触底事件完全不生效&#xff0c;明明滚动到了页面底部&#xff0c;却始终没有触发预…

Node.js用WebAssembly加速音频处理

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Node.js与WebAssembly&#xff1a;音频处理性能的革命性加速 目录 Node.js与WebAssembly&#xff1a;音频处理性能的革命性加速 引…

成都配眼镜攻略:3家专业、性价比高的地方推荐,告别各种坑

成都配眼镜攻略:3家专业、性价比高的地方推荐,告别各种坑 在成都配眼镜,你是否也被这些问题困扰?验光模糊导致头晕、进口镜片价格虚高、售后承诺无法兑现…… 基于验光专业性、镜片品质、售后服务、性价比四大核心维度…

ARM Cortex-M 存储器映射

ARM Cortex-M 存储器映射 一、概述 ARM Cortex-M处理器的存储器映射是一个统一编址的32位地址空间&#xff08;4GB&#xff09;&#xff0c;这个空间被预定义为不同的功能区域&#xff0c;每个区域有特定的用途和访问特性。 二、存储器映射整体布局 0xFFFFFFFF ┌─────…

CRMEB多商户系统(PHP)- 移动端二开之基本容器组件使用

1、二开为什么要使用基本容器组件在做CRMEB 多商户系统&#xff08;PHP&#xff09;移动端二开的时候&#xff0c;最消磨耐心的往往不是业务逻辑&#xff0c;而是那些琐碎却必须处理的 UI 适配问题&#xff0c;例如全面屏手机顶部的“刘海”和“灵动岛”&#xff0c; 底部安全区…

【必看】成都配眼镜攻略,实测答案:性价比高、专业的地方推荐

【必看】成都配眼镜攻略,实测答案:性价比高、专业的地方推荐 如果你在成都搜“成都配眼镜哪里好”,多半不是因为你想换个新镜框,而是因为你已经被现实折磨过一轮了:戴着看得清,但一到下午就眼胀;手机能看清,抬头看远处…

VSCode远程连接AlmaLinux虚拟机问题总结

一、问题概述今天在通过VSCode Remote-SSH插件连接AlmaLinux虚拟机&#xff08;VirtualBox&#xff09;时&#xff0c;主要遇到以下三个阶段的问题&#xff1a;问题阶段核心问题影响解决状态第一阶段​SSH认证失败无法建立连接✅ 已解决第二阶段​VS Code Server安装失败连接后…

成都配眼镜攻略:4家专业且性价比高地方推荐,别再为溢价买单

成都配眼镜攻略:4家专业且性价比高地方推荐,别再为溢价买单 “孩子配的防控镜越戴度数越高”“加班两小时眼胀到流泪”“应急配镜花了双倍钱还不舒服”—— 在成都配眼镜,你是不是也踩过这些坑?结合上千用户真实体验,…

新虚拟机安装 Go 环境:问题总结与解决方案

一、问题时间线回顾阶段问题现象根本原因初始阶段​bash: go: command not foundGo 环境未安装安装后阶段​Failed to run /usr/local/go/bin/go env网络无法访问官方源工具安装阶段​requires go > 1.25版本不兼容下载阶段​i/o timeout网络代理未配置二、核心问题与解决方…

勤能补拙的艺术:分享基础差怎么备考主治医师的核心方法

勤能补拙的艺术:分享基础差怎么备考主治医师的核心方法对医务工作者来说,主治医师职称是专业能力的有效认证,更是职业晋升的关键阶梯。随着行业发展与人才评价体系完善,通过主治医师考试成为医生职业跃升的硬性要求…

Nginx转发自定义请求头踩坑实录:跨域、移动端影响及全场景解决方案

在微服务架构中&#xff0c;Nginx 作为反向代理与 Gateway&#xff08;如 Spring Cloud Gateway&#xff09;配合是常见组合&#xff0c;常需通过自定义请求头&#xff08;如灰度标识 color_sign&#xff09;实现灰度发布、权限校验等功能。但实际配置中易出现请求头丢失、跨域…

一维、二维、三维热传导方程的MATLAB数值求解方法

一、一维热传导方程 MATLAB实现(显式法): % 参数设置 L = 1.0; % 杆长 (m) Nx = 50; % 空间节点数 dx = L/(Nx-1); % 空间步长 (m) alpha = 0.01; % 热扩散率 (m/s) T_left = 100; % …

Free MP4 to MP3 Converter

https://freeconvert.cc/en/mp4-to-mp3/

扩展方法#x2B;泛型#x2B;委托#x2B;Lambda 联合使用

笔记&#xff1a;SetDefaultValue方法拆解&#xff08;扩展方法泛型委托Lambda&#xff09;核心功能 为Entity对象安全取值&#xff1a;指定字段名&#xff0c;有值则用委托转换后返回&#xff0c;无值/转换失败则返回默认值。白话拆解&#xff08;以取Name为例&#xff09; 原…

主治医师备考新路径:数字化备考技巧与智能平台解析

主治医师备考新路径:数字化备考技巧与智能平台解析随着我国医疗卫生事业的快速发展,医师职称晋升已成为医疗人才队伍建设的重要环节。然而,临床工作强度持续增加带来的“工学矛盾”日益凸显,传统备考模式已难以适应…