全排列(回溯)

LCR 083. 全排列 - 力扣(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 中的所有整数 互不相同

题解

本题与组合问题很类似,依旧使用for循环控制每层遍历,使用递归控制每个树枝上的深层遍历。在组合问题中,笔者详细说明了回溯算法的图解表示,详情可见

组合(回溯+剪枝、图解)-CSDN博客

在本题中,使用回溯算法与组合问题的对比,只有两个不同点

扫描二维码关注公众号,回复: 17219613 查看本文章
  • 对于每次遍历,其起始位置都从0开始,而不再使用startIndex控制每层的遍历起始位置,因为全排列是无序的,对于[1,2]和[2,1]是两个不同的排列
  • 由于每次遍历的起始位置都从0开始,因此要额外使用一个used数组,用于对每个元素的遍历进行标记

是的,这其实就是最原始的DFS算法应用

代码

class Solution {
private:
    vector<int> path;
    vector<vector<int>> res;
public:
    void backing(vector<int>&nums,vector<int>used)
    {
        if(path.size()==nums.size())
        {
            res.push_back(path);
            return ;
        }
        for(int i=0;i<nums.size();i++)
        {
            if(used[i]==1) continue;
            used[i]=1;
            path.push_back(nums[i]);
            backing(nums,used);
            path.pop_back();
            used[i]=0;
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<int> used(nums.size(),0);
        backing(nums,used);
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_58158950/article/details/134785938
今日推荐