c++力扣题目全排列

作者主页:慢热的陕西人

专栏链接:力扣刷题日记

欢迎各位大佬点赞关注收藏,留言

文章目录

  • 全排列
    • 题目链接
    • 题目描述
    • 解题思路
    • 代码

全排列

题目链接

46. 全排列 - 力扣(LeetCode)

题目描述

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

解题思路

典型的回溯题⽬,我们需要在每⼀个位置上考虑所有的可能情况并且不能出现重复。通过深度优先搜
索的⽅式,不断地枚举每个数在当前位置的可能性,并回溯到上⼀个状态,直到枚举完所有可能性,
得到正确的结果。

每个数是否可以放⼊当前位置,只需要判断这个数在之前是否出现即可。具体地,在这道题⽬中,我
们可以通过⼀个递归函数backtrack和标记数组visited来实现全排列。

递归函数的设计 void dfs(vector& nums):

只有一个参数用来存放输入的数组;

递归流程如下:

  1. ⾸先定义⼀个⼆维数组ret⽤来存放所有可能的排列,⼀个⼀维数组ret⽤来存放每个状态的排
    列,⼀个⼀维数组check标记元素,然后从第⼀个位置开始进⾏递归;

  2. 在每个递归的状态中,我们维护⼀个路径path,表⽰当前已经处理的路径;

  3. 递归结束条件:当path.size()等于nums数组的⻓度时,说明我们已经处理完了所有数字,将当前数组
    存⼊结果中;

  4. 在每个递归状态中,枚举所有下标i,若这个下标未被标记,则使⽤nums数组中当前下标的元
    素:

    a.将check[i]标记为1;

    b.将nums[i]push到path的尾部;

    c.对当前路径的下一位置进⾏递归;dfs(nums);

    d.将check[i]标记为0,表示回溯;

代码

class Solution {
    vector<vector<int>> ret;
    vector<int> path;
    bool check[7];
 
public:
    vector<vector<int>> permute(vector<int>& nums) 
    {
        dfs(nums);
        return ret;
    }

   
    {
        if(nums.size() == path.size())
        {
            ret.push_back(path);
            return;
        }

        for(int i = 0; i < nums.size(); ++i)
        {
            if(check[i] == false)
            {
                path.push_back(nums[i]);        
                check[i] = true;
                dfs(nums);
                path.pop_back();
                check[i] = false;
            }    
        }
    }
}

你可能感兴趣的:(C++,C++算法,力扣刷题日记,c++,leetcode,开发语言)