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

LeetCode-47. 全排列 II

1、题目描述:

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

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

示例 2:

输入: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 <= 8
  • -10 <= nums[i] <= 10

2、代码:

#include <algorithm>
#include <vector>
using namespace std;class Solution {
public:vector<vector<int>> permuteUnique(vector<int>& nums) {sort(nums.begin(), nums.end()); // 排序使相同元素相邻,方便后续剪枝vector<vector<int>> result;      // 存储所有唯一排列的结果集vector<int> path;               // 当前递归路径的排列vector<bool> used(nums.size(), false); // 标记元素是否被使用过backtrack(nums, result, path, used);return result;}private:void backtrack(vector<int>& nums, vector<vector<int>>& result,vector<int>& path, vector<bool>& used) {// 终止条件:当前路径长度等于数组长度,得到一个完整排列if (path.size() == nums.size()) {result.push_back(path);return;}// 遍历所有元素选择可能的排列元素for (int i = 0; i < nums.size(); i++) {// 剪枝条件(核心逻辑):// 1. 当前元素已被使用过,跳过// 2. 当前元素与前一个元素相同,且前一个元素未被使用(树层剪枝)if (used[i] || (i > 0 && nums[i] == nums[i - 1] && !used[i - 1])) {continue;}// 选择当前元素used[i] = true;           // 标记为已使用path.push_back(nums[i]);  // 加入当前路径backtrack(nums, result, path, used); // 递归进入下一层选择// 回溯操作(状态重置)path.pop_back();          // 从路径移除最后添加的元素used[i] = false;          // 恢复元素未使用状态}}
};

3、解题思路:

  1. ​排序预处理​

    • 先对数组排序,使相同元素相邻,便于后续剪枝判断重复元素。
    • 示例:[1,1,2] → 排序后为 [1,1,2]
  2. ​回溯框架​

    • 通过递归遍历所有可能的排列组合。
    • path 记录当前路径,used 标记已使用的元素,result 存储结果。
  3. ​剪枝策略​

    • ​跳过已使用元素​​:若 used[i] == true,直接跳过。
    • ​树层剪枝​​:若当前元素与前一个相同,且前一个未被使用,跳过当前元素。
      (避免同一层递归中选择相同元素,消除重复排列,前一个相同元素未被使用,说明在更浅的递归层已经被处理过,当前层需要跳过以避免重复)

相关文章:

  • Kafka集群
  • Flutter 学习之旅 之 flutter 使用 【验证码】输入组件的简单封装
  • 如何安装Visio(win10)
  • 【阿里云大模型高级工程师ACP习题集】2.3 优化提示词改善答疑机器人回答质量
  • python实战项目64:selenium采集软科中国大学排名数据
  • Alertmanager的安装和详细使用步骤总结
  • 【Java面试笔记:基础】12.Java有几种文件拷贝方式?哪一种最高效?
  • JAVA程序获取SVN提交记录
  • SPSS ANOVA分析test
  • 云原生--CNCF-2-五层生态结构(成熟度3层分类,云原生生态5层结构)
  • 18487.1-2015-解读笔记之四-交流充电之流程分析
  • word内容使用python替换
  • 【go】go run-gcflags常用参数归纳,go逃逸分析执行语句,go返回局部变量指针是安全的
  • 连锁美业管理系统「数据分析」的重要左右分析︳博弈美业系统疗愈系统分享
  • 自动创建 中国古代故事人物一致性图画,看看扣子的空间是否能达到你的满意,自媒体的福音?
  • PCB规则
  • Python爬虫实战:获取xie程网敦煌景点数据,为51旅游路线做参考
  • Linux网络编程 从集线器到交换机的网络通信全流程——基于Packet Tracer的深度实验
  • Docker安装ES :确保 Kibana 正确连接 Elasticsearch
  • Unity中使用Cinemachine插件创建自由视角相机(freelookCamera)来实现第三人称漫游
  • 京东美团商战,能惠及骑手吗?
  • 神二十航天员公布
  • 31年前失踪的男孩与家人在重庆一派出所团聚:人像比对后DNA鉴定成功
  • 4月语言学联合书单|法庭审判话语的态度表达及人际功能研究
  • 罗马教皇方济各去世,享年88岁
  • 收藏家尤伦斯辞世,曾是中国当代艺术的推手与收藏者