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]
输出:[[1]]
解题思路
在递归回溯每一个数的基础上加上一个标记数组来判断是否该数已经被添加.
问 答 递归返回条件 如果路径长度等于原来数组长度,就说明找到一种可能 单层递归 每一次递归都从0开始,遍历整个数组,寻找还没有被标记的数来进来递归 参数 其实不需要额外的参数,但是我用了一个参数来记录数组长度,这样不用每次都用.size()来获取 剪枝 不需要
代码:
class Solution {
public:
//结果数组
vector<vector<int>> res;
//记录路径
vector<int>path;
//记录已经添加过的元素
vector<bool> flag{false,false,false,false,false,false};
//nums是原数组
//K是原数组长度
void findPer(vector<int>nums,int k)
{
//如果路径长度等于K,也就是原数组长度
if (path.size() == k)
{
res.push_back(path);
return;
}
//从0开始遍历整个数组
for (int i = 0; i < k; i++)
{
//如果flag[i]为flag就说明还没有加入路径,就加入然后开始继续递归
if (flag[i] != true)
{
flag[i] = true;
path.push_back(nums[i]);
//递归继续寻找下一个
findPer(nums, k);
//回溯
path.pop_back();
flag[i] = false;
}
}
}
vector<vector<int>> permute(vector<int>& nums)
{
//开始递归
findPer(nums,nums.size());
//返回结果
return res;
}
};
总结:
回溯种排序跟组合差不多,就是排序是不同的顺序是不同的解.但是组合无论顺序.