【leetcode】全排列 回溯法

46.全排列

46. 全排列 - 力扣(LeetCode)

给定一个不含重复数字的数组 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 {
private:
    void swap(int* a,int* b)
    {
        int temp=*b;
        *b=*a;
        *a=temp;
    }
    void backtrack(vector<int>& nums,vector<vector<int>>& result,int n,int size)
    {
        if(n==size)
        {
            result.push_back(nums);
            return;
        }
        for(int i=n;i<size;i++)
        {
            swap(&nums[i],&nums[n]);
            backtrack(nums,result,n+1,size);
            swap(&nums[i],&nums[n]);
        }
    }
public:
    vector<vector<int>> permute(vector<int>& nums) {
        int size=nums.size();
        vector<vector<int>> result;
        backtrack(nums,result,0,size);
        return result;
    }
};

47.全排列II

47. 全排列 II - 力扣(LeetCode)

给定一个可包含重复数字的序列 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]]
cpp 复制代码
class Solution {
private:
    void swap(int* a,int* b)
    {
        int temp=*b;
        *b=*a;
        *a=temp;
    }
    int ok(vector<int>& nums,int i,int n)
    {
        if(i>n)
        {
            for(int j=n;j<i;j++)
            {
                if(nums[j]==nums[i])    return 0;
            }
        }
        return 1;
    }
    void backtrack(vector<int>& nums,vector<vector<int>>& result,int n,int size)
    {
        if(n==size-1)
        {
            result.push_back(nums);
            return;
        }
        for(int i=n;i<size;i++)
        {
            if(ok(nums,i,n))
            {
                swap(&nums[i],&nums[n]);
                backtrack(nums,result,n+1,size);
                swap(&nums[i],&nums[n]);
            }
        }
    }
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        int size=nums.size();
        vector<vector<int>> result;
        backtrack(nums,result,0,size);
        return result;
    }
};
相关推荐
nbsaas-boot22 分钟前
多智能体系统的架构边界:任务编排、共享状态与故障隔离设计
人工智能·算法·动态规划
wuyk55539 分钟前
12.归并排序:分治思想的稳定排序算法
开发语言·数据结构·算法·排序算法
吴声子夜歌43 分钟前
ApacheCommons——commons-text(模板替换与文本算法)
java·开发语言·算法·apache
JiNan.YouQuan.Soft1 小时前
数值计算引擎:计算固体力学
人工智能·算法·机器学习
和裕1 小时前
光伏储能定制加强型瓦楞纸箱:降低组件运输隐裂率与售后损耗的核心价值
大数据·运维·网络·人工智能·算法
Pointer Pursuit2 小时前
C++11特性(二)
前端·c++·算法
lvwangshu2 小时前
数位 DP 进阶
算法·动态规划
她的男孩2 小时前
一个开源低代码框架的协作 SPI 是怎么设计的 ForgeAdmin 拆解 + 实战接入新平台
后端·算法·架构
OPEN-F2 小时前
C++20新特性精讲:概念、范围与三路比较
算法·c++20
tudousisi2222 小时前
CSP 第3题训练 Day 5|CSP202509C HTTP 头信息|Blog A
c++