【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;
    }
};
相关推荐
Controller-Inversion41 分钟前
322. 零钱兑换
算法
头发够用的程序员42 分钟前
C++和Python面试经典算法汇总(一)
开发语言·c++·python·算法·容器·面试
淡海水1 小时前
【AI模型】模型量化技术详解
人工智能·算法·机器学习
炸膛坦客1 小时前
嵌入式 - 数据结构与算法:(1-1)数据结构 - 顺序表(Sequential List)
数据结构·算法·嵌入式
水龙吟啸1 小时前
数据结构与算法随机复习–Day1
数据结构·c++·算法
生成论实验室1 小时前
《事件关系阴阳博弈动力学:识势应势之道》第八篇:认知与反思关系——探索、定位与延续
人工智能·算法·架构·知识图谱·创业创新
十五年专注C++开发2 小时前
浅谈LLVM
开发语言·c++·qt·clang·llvm
YaraMemo2 小时前
一文带你区分全局最优解和帕累托最优解
算法·5g·信息与通信·信号处理
白夜11172 小时前
C++(标签派发 Tag Dispatching)
开发语言·c++·笔记·算法
王老师青少年编程2 小时前
csp信奥赛C++高频考点专项训练之字符串 --【字符串基础】:凯撒密码
c++·字符串·csp·凯撒密码·高频考点·信奥赛·一等奖