【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;
    }
};
相关推荐
呜喵王阿尔萨斯3 分钟前
git命令解析
c++·git
点云SLAM3 小时前
PyTorch 中.backward() 详解使用
人工智能·pytorch·python·深度学习·算法·机器学习·机器人
only-qi4 小时前
146. LRU 缓存
java·算法·缓存
梁辰兴5 小时前
数据结构:排序
数据结构·算法·排序算法·c·插入排序·排序·交换排序
Murphy_lx5 小时前
Lambda表达式
开发语言·c++
yangpipi-5 小时前
C++并发编程-23. 线程间切分任务的方法
开发语言·c++
Lris-KK5 小时前
【Leetcode】高频SQL基础题--1731.每位经理的下属员工数量
sql·leetcode
野犬寒鸦5 小时前
力扣hot100:搜索二维矩阵 II(常见误区与高效解法详解)(240)
java·数据结构·算法·leetcode·面试
菜鸟得菜5 小时前
leecode kadane算法 解决数组中子数组的最大和,以及环形数组连续子数组的最大和问题
数据结构·算法·leetcode
楼田莉子6 小时前
C++算法专题学习——分治
数据结构·c++·学习·算法·leetcode·排序算法