这里要打印出所有的可能组合,所以采用递归的方式来解决问题,先设立一个标志数组,判断该位置是否被访问过,避免结果出现重复,然后递归访问 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版权协议,转载请附上原文出处链接和本声明。