LeetCode.46. 全排列(回溯法入门)

这篇具有很好参考价值的文章主要介绍了LeetCode.46. 全排列(回溯法入门)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面:

题目链接:LeetCode.46. 全排列
编程语言:C++
题目难度:中等

一、题目描述

给定一个不含重复数字的数组 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 中的所有整数 互不相同

二、解题思路

2.1 回溯法

我们再次用 树状思维逻辑,从根出发,叶子节点为结果集之一
示例:
LeetCode.46. 全排列(回溯法入门)
这个树像是做一个减法:
从这个集合里,不断的取出一个数字,再将这个数字从当前集合中删除掉,剩下的元素做下一次的可选值

LeetCode.46. 全排列(回溯法入门)
这里我曾经想用一个set 保存这些值,每选一个数字,就从set 中 erase 掉这个数字,然后把这个 set 再做下一次选择的集合,问题是每次需要初始化为一个 全集,似乎有点麻烦,这样我们换一种思路:

维护一个 vector<bool> isUsed 数组,开始都初始化为 false ,代表每个元素都没有用过,每当选择其中一个元素,将该元素置为 true 代表用过了,下一次选择的时候,只选择 值为 false 的元素

LeetCode.46. 全排列(回溯法入门)
这里的下一次当然要使用递归,一直递归到 结果 刚好 == nums.size() , 表示这一组排列组合已经完成了,那么如何回溯呢?
LeetCode.46. 全排列(回溯法入门)

代码实现:

class Solution {
public:
    vector<vector<int>> vctResult;//所有结果集
    vector<int> vctTemp;//子集
    void back(vector<int>& nums, vector<bool>& isUsed)
    {
        if(vctTemp.size() == nums.size())
        {
            vctResult.push_back(vctTemp);
            return;
        }
        for(int i = 0; i < nums.size();i++)
        {
            if(isUsed[i] == false)
            {
                vctTemp.push_back(nums[i]);//选择该数字
                isUsed[i] = true;
                back(nums, isUsed);//递归继续往下选择
                isUsed[i] = false;//回溯
                vctTemp.pop_back();
            }
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<bool> isUsed(nums.size(), false);//每个元素的使用情况
        back(nums, isUsed);
        return vctResult;
    }
};

其实回溯代码也是有一个套路和模板的大致样子的,例如上述题目:

result //结果
def backtrack(路径, 选择列表):
    if 满足结束条件:
        reslut.push_back(结果集)
        return
    
    for 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择

三、完整代码

class Solution {
public:
    vector<vector<int>> vctResult;//所有结果集
    vector<int> vctTemp;//子集
    void back(vector<int>& nums, vector<bool>& isUsed)
    {
        if(vctTemp.size() == nums.size())
        {
            vctResult.push_back(vctTemp);
            return;
        }
        for(int i = 0; i < nums.size();i++)
        {
            if(isUsed[i] == false)
            {
                vctTemp.push_back(nums[i]);//选择该数字
                isUsed[i] = true;
                back(nums, isUsed);//递归继续往下选择
                isUsed[i] = false;//回溯
                vctTemp.pop_back();
            }
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        vector<bool> isUsed(nums.size(), false);//每个元素的使用情况
        back(nums, isUsed);
        return vctResult;
    }
};

运行结果:
LeetCode.46. 全排列(回溯法入门)文章来源地址https://www.toymoban.com/news/detail-462699.html

到了这里,关于LeetCode.46. 全排列(回溯法入门)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Day31 46全排列 47全排列II 回溯去重tips 51N皇后 37解数独

    给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]  排列问题与组合问题的不同之处就在于,没有startIndex,同时需要设置一个used数组,遍历过的就设置成true,下次遇到时跳过。 给定一个可包含重

    2024年01月20日
    浏览(46)
  • LeetCode刷题——46.全排列

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

    2024年02月12日
    浏览(33)
  • LeetCode 46 全排列

    全排列 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 示例 2: 示例 3: 提示: 1 = nums.length = 6 -10 = nums[i] = 10 nums 中的所有整数 互不相同 回溯法 这个问题可以看作有 n 个排列成一行的空格,我们需要从左往右依此填

    2024年01月19日
    浏览(39)
  • 【LeetCode-中等题】46. 全排列

    1、子集去重版本 2、组合去重版本 3、子集非去重版本 这题中nums中的数各不相同,所以不需要去重: 而下面这题,nums中的数会存在重复值,就需要去重: 参考讲解视频:代码随想录—全排列不去重版本 关键在于递归之后还要还原做回溯动作: 所以最后,我们统计到的res才

    2024年02月09日
    浏览(51)
  • LeetCode(力扣)46. 全排列Python

    https://leetcode.cn/problems/permutations/

    2024年02月09日
    浏览(33)
  • C++ | Leetcode C++题解之第46题全排列

    题目: 题解:

    2024年04月24日
    浏览(42)
  • leetcode--回溯算法.全排列(java)

    leetcode 46 原题链接-- 全排列 题目描述: 给定一个不含重复数字的数组 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

    2024年02月08日
    浏览(36)
  • LeetCode 1079. Letter Tile Possibilities【哈希表,回溯,动态规划,排列组合】中等

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2024年02月10日
    浏览(53)
  • 力扣 46. 全排列

    题目来源:https://leetcode.cn/problems/permutations/description/   C++题解: 全排列每一次都需要从第一个元素开始遍历,所以不用ind标记开始元素,都从0开始,但需要一个数组used不断更新哪些元素已经被使用,遍历到使用过的元素跳过即可。

    2024年02月12日
    浏览(62)
  • 回溯算法篇-01:全排列

    这道题属于上一篇——“回溯算法解题框架与思路”中的 “元素不重复不可复用” 那一类中的 排列类问题。 我们来回顾一下当时是怎么说的: 排列和组合的区别在于,排列对“顺序”有要求。比如 [1,2] 和 [2,1] 是两个不同的结果。 这就导致了同一个元素 在同一条路径中不

    2024年01月20日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包