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 中的所有整数 互不相同

思路

这道题我们需要通过不断尝试所有可能的组合,发现这个组合不满足条件或者已经排列完毕时,就返回上一步,接着尝试其他的可能性。从数组的第一个位置开始,把每个元素放到这个位置上,然后递归地处理数组的下一个位置,把剩下的元素放到这个位置。所有位置都被填满时,就得到了一个完整的排列。每次递归调用结束后,还要恢复数组的原来的样子,这样才能接着尝试其他的排列组合。

代码

cpp 复制代码
class Solution {
public:
    void hs(vector<vector<int>>& res,vector<int>& r,int f,int l)
    {//res是结果,r是现在的排列数组,f是当前位置,l是数组长度
        if(f==l)//已经有了一个完整的排列
        {
            res.emplace_back(r);
            return;
        }
        for(int i=f;i<l;i++)
        {
            swap(r[i],r[f]);//交换i和first的位置
            hs(res,r,f+1,l);//处理下一个位置
            swap(r[i],r[f]);//恢复原来的顺序
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> res;
        hs(res,nums,0,(int)nums.size());
        return res;
    }
};
相关推荐
sheeta1998几秒前
LeetCode 每日一题笔记 日期:2026.05.31 题目:2126. 摧毁小行星
笔记·算法·leetcode
INGNIGHT11 分钟前
984.不含 AAA 或 BBB 的字符串(贪心)
开发语言·算法·leetcode
飞天狗11114 分钟前
2025第十六届蓝桥杯c/c++B组国赛题解
c语言·c++·算法·蓝桥杯
超梦dasgg19 分钟前
Tarjan算法解 强连通分量 & 循环依赖
算法·深度优先·图论
努力努力再努力wz25 分钟前
【Qt入门系列】:QLabel控件详解:从文本显示到图片展示,再到内容布局与伙伴机制
android·开发语言·数据结构·数据库·c++·qt·mysql
散峰而望41 分钟前
【算法练习】算法练习精选:从 Phone numbers 到 Decrease,覆盖字符串、模拟、图论思维题
数据结构·c++·算法·贪心算法·github·动态规划·图论
薇茗1 小时前
【C++】 基础语法篇
c++·c++基础语法
人道领域1 小时前
【LeetCode刷题日记】538.把二叉搜索树转换为累加树
java·开发语言·后端·算法·leetcode
并不喜欢吃鱼1 小时前
从零开始 C++----- 十二【C++ 数据结构】map/set 全解析:从使用到红黑树底层模拟实现
开发语言·数据结构·c++
不会C语言的男孩1 小时前
C++ Primer Plus 第17章:输入、输出和文件
开发语言·c++