46. 全排列015(回溯法求解)

一:题目

在这里插入图片描述
示例 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.思路:

1.这道题用的算法思想是回溯法,也就是穷举所有的可能,所以说回溯法也是没有办法的方法
2.那么在这里我们选用的解的空间是 排列树 也就是从根节点每次往下的分支减少一个
3.这里的在 backstrack 中 for循环相当于横向遍历,遍历到所有的元素,纵向的就是backstrack
递归 寻找一种可行解,但在递归的时候需要记录已经访问过的元素,因为每次都是从开始来遍历所有的元素
4.这里的递归终止条件是 path中的元素个数已经等于 nums.size()了,。这时也就还是排列树的
的叶节点了,记录下一个结果

2:图解过程(其选择的解的空间是排列树)

这里在选择解的空间的时候判断其用的是排列树:因为每次往下分支均减少一,而且排列树的叶节点个数为 : (n-1)! 个,n为集合元素个数

在这里插入图片描述

三:上码

class Solution {
public:

    vector<vector<int>> result;
    vector<int>path;

    void backstrack(vector<int>& nums,vector<bool>& used){
        
        //递归终止条件 当path中已经存了一种可能
        if(path.size() == nums.size()){
            result.push_back(path);
            return ;
        }

        for(int i = 0; i < nums.size(); i++){
            
            if(used[i] == true) 
                continue;

            path.push_back(nums[i]);
            used[i] = true;// 记录已经访问过的元素 
            backstrack(nums,used);

            //每次结束一次for循环 那么就需要将puth进去的元素剔除掉,因为最外层的for循环
            path.pop_back();
            used[i] = false;

        }

    }

    vector<vector<int>> permute(vector<int>& nums) {

        /**
            思路:
                1.这道题用的算法思想是回溯法,也就是穷举所有的可能,所以说回溯法也是没有办法的方法
                2.那么在这里我们选用的解的空间是  排列树 也就是从根节点每次往下的分支减少一个
                3.这里的在 backstrack 中 for循环相当于横向遍历,遍历到所有的元素,纵向的就是backstrack
                  递归 寻找一种可行解,但在递归的时候需要记录已经访问过的元素,因为每次都是从开始来遍历所有的元素
                4.这里的递归终止条件是 path中的元素个数已经等于 nums.size()了,。这时也就还是排列树的
                  的叶节点了,记录下一个结果 

        */

   

        vector<bool>used(nums.size(),false);
        backstrack(nums,used);

        return result;


    }
};

在这里插入图片描述

加油 boy!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天向上的菜鸡杰!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值