算法——46全排列(力扣)

这里要打印出所有的可能组合,所以采用递归的方式来解决问题,先设立一个标志数组,判断该位置是否被访问过,避免结果出现重复,然后递归访问 nums 变量,将可能的结果存储下来

class Solution {
public:
    typedef bool* Bool;	// 是为了验证这种方式下的值传递能否回溯,结果是不能

    void Get(vector<vector<int>>& tar, vector<int> nums, vector<int> temp, int n, int i, Bool state)
    {
        temp.push_back(nums[i]);
        if(temp.size() == n)
        {
            tar.push_back(temp);
            return ;
        }
        for(i = 0; i < n; ++i)
        {
            if(state[i] == false)
            {
                state[i] = true;
                Get(tar, nums, temp, n, i, state);
                state[i] = false;
            }
        }
    }

    vector<vector<int>> permute(vector<int>& nums) {
        int i = 0, n = nums.size();
        vector<vector<int>> tar;
        if(n <= 1)	// 如果本身只有1个元素,那么全排列就是本身,这种情况单独摘出来
        {
            tar.push_back(nums);
            return tar;
        }
        Bool state = new bool[n];
        for(i = 0; i < n; ++i)	// 初始化标志数组
        {
            state[i] = false;
        }
        vector<int> temp;

		// 进入递归
        for(i = 0; i < n; ++i)
        {
            state[i] = true;
            Get(tar, nums, temp, n, i, state);
            state[i] = false;
        }

        return tar;
    }
};

版权声明:本文为qq_45760401原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。