因为确定leecode测试用例:-10 <= nums[i] <= 10,所以使用固定数组来代替unordered_set<> 进行树枝节点去重操作,减少一定的开销,同时相对来讲提升一定运行速度。
给出全排列算法关键思路:
代码:
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
int used[21]={0};// 存储出现的元素 作为全局变量 这里目的:对同一树枝进行去重操作
void backtracking(const vector<int>& nums)
{
// 找到了一组全排列
if(path.size()==nums.size())
{
result.push_back(path);// 添加结果
return;// 这里需要return,否则会不断递归下去
}
// for循环遍历树层节点,需要从0(初始位置)开始,不可从startIndex开始
for(int i=0;i<nums.size();++i)
{
// 若当前元素在同一树枝出现过,则continue
if(used[nums[i]+10]==1)
continue;
else
used[nums[i]+10]=1;// // 若当前元素在同一树枝未出现,置1表示出现
path.push_back(nums[i]);// 处理节点
backtracking(nums);// 递归
path.pop_back();// 回溯,撤销处理节点
// 因为是对同一树枝节点进行去重操作,所以要对used“集合”中元素进行回溯,删除掉树枝出现过的节点
used[nums[i]+10]=0;
}
}
vector<vector<int>> permute(vector<int>& nums) {
backtracking(nums);
return result;
}
};