与组合的区别:
1. 不用startIndex,也就是说,{1, 2} {2 , 1} , 是可以同时存在的,也就是循环每次都头从开始。
2. 但正因为从头开始,就需要对使用过的元素进行标记了,不然每次都会加入重复的数据。
这里用的是 used ,表示在树枝上,使用过了,就不再使用了。
也就是在 used[ i ] == true 的时候,就continue,这个意思就是在树枝上,这个元素已经被使用过了。题目说了,不含重复数字,也就不需要对树层去重。
之前判断的是 used[ i ] == false ,判断的是树层上的去重。树枝不需要判断去重,因为每次循环的开始都是 startIndex。而 startIndex 在上一层就被 + 1 ,所以不可能会取到取过的元素。
class Solution {
public:
vector<int> path;
vector<vector<int>> res;
void backtracking(vector<int> &nums,vector<bool> &used)
{
if(path.size() == nums.size())
{
res.push_back(path);
return;
}
for(int i = 0; i < nums.size(); i++)
{
if(used[i] == true)
continue;
used[i] = true;
path.push_back(nums[i]);
backtracking(nums, used);
path.pop_back();
used[i] = false;
}
return;
}
vector<vector<int>> permute(vector<int>& nums) {
vector<bool> used(nums.size(), false);
backtracking(nums, used);
return res;
}
};