【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;
    }
};
相关推荐
ChillJavaGuy12 小时前
常见限流算法详解与对比
java·算法·限流算法
sali-tec12 小时前
C# 基于halcon的视觉工作流-章34-环状测量
开发语言·图像处理·算法·计算机视觉·c#
你怎么知道我是队长13 小时前
C语言---循环结构
c语言·开发语言·算法
艾醒13 小时前
大模型面试题剖析:RAG中的文本分割策略
人工智能·算法
老赵的博客13 小时前
c++ unqiue指针
java·jvm·c++
程序猿编码14 小时前
基于 Linux 内核模块的字符设备 FIFO 驱动设计与实现解析(C/C++代码实现)
linux·c语言·c++·内核模块·fifo·字符设备
怎么没有名字注册了啊14 小时前
MFC_Install_Create
c++·mfc
Wadli15 小时前
C++语法 | static静态|单例模式
开发语言·c++·单例模式
纪元A梦15 小时前
贪心算法应用:K-Means++初始化详解
算法·贪心算法·kmeans
_不会dp不改名_15 小时前
leetcode_21 合并两个有序链表
算法·leetcode·链表