力扣46题:全排列
题目描述
给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
输入输出样式
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
输入:nums = [0,1]
输出:[[0,1],[1,0]]
输入:nums = [1]
输出:[[1]]
解法:使用回溯算法完成
vector<vector<int>>permute(vector<int>&nums)
{
vector<vector<int>>res;
//使用递归的方法
vector<bool>valArr(nums.size(),false);
int length=nums.size();
int depth=0;
if(length==0)
{
return res;
}
//设置path 数组保存遍历的路径
vector<int>path;
//获取不同的排列
getArray(nums,length,depth,path,valArr,res);
return res;
}
void getArray(vector<int>nums,int length,int depth,vector<int>&path,vector<bool>&valArr,vector<vector<int>>&res)
{
//当长度等于数组长度的时候,添加该序列到数组中
if(depth==length)
{
res.push_back(path);
return;
}
//在非叶子结点处,产生不同的分支==在还未选择的数中依次选择一个元素作为下一个位置的元素。
for(int i=0;i<length;i++)
{
if(!valArr[i])
{
path.push_back(nums[i]);
valArr[i]=true;
//迭代寻找下一个结点
getArray(nums,length,depth+1,path,valArr,res);
//寻找结束则,浅层结点重置为false
valArr[i]=false;
//并将当前的path的值剔出数组
path.pop_back();
}
}
}