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

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,直接跳过。
    • ​树层剪枝​​:若当前元素与前一个相同,且前一个未被使用,跳过当前元素。
      (避免同一层递归中选择相同元素,消除重复排列,前一个相同元素未被使用,说明在更浅的递归层已经被处理过,当前层需要跳过以避免重复)
http://www.xdnf.cn/news/1513.html

相关文章:

  • 杰理ac792开发板按键不起效果
  • ElasticSearch:高并发场景下如何保证读写一致性?
  • 搭建TypeScript单元测试环境
  • 高性能全闪存储在大模型训练与推理中的效率提升作用
  • HTTP 请求头的 key 不区分大小写。
  • 接口测试和功能测试详解
  • 【AI】Windows环境安装SPAR3D单图三维重建心得
  • 玩转Docker | 使用Docker部署Neko自托管浏览器
  • Chronos - 时间序列预测语言模型
  • SwiftUI 1.Text介绍和使用
  • Elasticsearch 报错 Limit of total fields [1000] has been exceeded
  • SwiftUI 3.Button介绍和使用
  • Python爬虫学习:高校数据爬取与可视化
  • UIAutomator 与 Playwright 在 AI 自动化中的界面修改对比
  • Java学习手册:Web 安全基础
  • MyBatis 升级至 MyBatis-Plus 详细步骤
  • 常用嵌入式软件代码编码规范的关系和覆盖
  • 海康NVR配置NAS-TrueNAS
  • Mysql 简单数据查询
  • 知识储备-后仿
  • AtCoder Beginner Contest 402题解
  • Pillow库中的convert(“L“)彩色图像转换灰度图像详解~
  • 2026《数据结构》考研复习笔记六(串的KMP算法)
  • 【网工第6版】第5章 网络互联⑥
  • 《MySQL:MySQL表的内外连接》
  • 【Redis】redis主从哨兵
  • MySQL常见问题解答
  • 【异常解决】Spring Boot 返回排序后的 Map 但前端接收顺序不对的解决方案
  • C++类与继承
  • SpringBoot中6种自定义starter开发方法