⭐算法OJ⭐全排列【回溯】(C++实现)Permutations II

47. Permutations II

Given a collection of numbers, nums, that might contain duplicates, return all possible unique permutations in any order.

Constraints:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

Example 1:

复制代码
Input: nums = [1,1,2]
Output:
[[1,1,2],
 [1,2,1],
 [2,1,1]]

Example 2:

复制代码
Input: nums = [1,2,3]
Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

包含重复元素的全排列问题 ,与不包含重复元素的全排列问题不同,需要避免生成重复的排列。使用回溯算法,并通过剪枝来确保生成的排列唯一。

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 回溯函数
void backtrack(vector<int>& nums, vector<vector<int>>& result, int start) {
    // 如果当前起始位置是数组的最后一个元素,说明找到一个排列
    if (start == nums.size()) {
        result.push_back(nums); // 将当前排列存入结果
        return;
    }

    // 用于记录当前层已经使用过的数字,避免重复
    vector<bool> used(21, false); // 数字范围在 -10 到 10 之间

    // 从起始位置开始,尝试交换元素
    for (int i = start; i < nums.size(); i++) {
        // 如果当前数字已经使用过,跳过
        if (used[nums[i] + 10]) { // +10 是为了将负数映射到正数
            continue;
        }

        used[nums[i] + 10] = true; // 标记当前数字已使用
        swap(nums[start], nums[i]); // 交换元素
        backtrack(nums, result, start + 1); // 递归到下一个位置
        swap(nums[start], nums[i]); // 回溯,撤销交换
    }
}

// 主函数:生成所有唯一排列
vector<vector<int>> permuteUnique(vector<int>& nums) {
    vector<vector<int>> result; // 存储所有唯一排列
    backtrack(nums, result, 0); // 从第 0 个位置开始回溯
    return result;
}
相关推荐
Bruce_Liuxiaowei8 小时前
Python 字典默认值完全指南:从 KeyError 到 defaultdict
开发语言·数据结构·python·字典
LuminousCPP8 小时前
从零开始学 C++(三):类和对象入门|从 struct 到 class,理解封装、对象与 this 指针
c++·笔记·学习·类和对象
郝学胜-神的一滴9 小时前
游戏引擎原理与实践 01:聊聊游戏引擎的前世今生
开发语言·c++·游戏引擎·产品运营·软件工程·产品经理·untiy
Allen_LVyingbo9 小时前
信息化部门在AI时代的编程转移路径分析(上)
人工智能·python·算法·健康医疗·数据库开发·时序数据库·数据库架构
七牛云行业应用9 小时前
Jev 报 401 / api_key_required 怎么解决:TypeSafe AI 官方错误码表与排查步骤
算法·github
晴天的雨.9929 小时前
【C++算法】三数之和
开发语言·c++·算法
pippocao9 小时前
王者荣耀日志组件BqLog 为何如此快之3——压缩日志执行路径优化
c++
AC赳赳老秦9 小时前
公开 CSV 数据集批量处理实战:用 OpenClaw 高效完成下载、清洗与标准化分析样本生成
java·开发语言·汇编·c++·python·deepseek·openclaw
凉茶钱10 小时前
【吃透C++】static、友元、内部类、匿名对象与拷贝编译器优化全解析
c++·青少年编程·visual studio
无名猿10 小时前
左值引用、右值引用与万能引用:引用折叠全解
c++·现代c++·模板元编程·语法基础