46.全排列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
private:
set<int> recordFirst;
vector<vector<int>> result;
vector<int> path;
public:
void backtrace(vector<int>& nums){
if(path.size() == nums.size()){
result.push_back(path);
return;
}

for(int i = 0; i < nums.size(); i++){
if(recordFirst.find(nums[i]) != recordFirst.end()){
continue;
}

path.push_back(nums[i]);
recordFirst.insert(nums[i]);
backtrace(nums);
recordFirst.erase(nums[i]);
path.pop_back();
}
}

vector<vector<int>> permute(vector<int>& nums) {
backtrace(nums);
return result;
}
};

我们简单捋一下思路,这道题相当简单。

从此题的题意可以看出,我们每次必须从数组的开头遍历,那我们就不需要像前面的组合题那样需要一个参数来记录当前位置,以方便下一个栈能够找到从哪里继续开始。

也正因为这个缘故,我们必须判断已加入到路径中的元素不可再重复。用一个全局的记录项 recordFirst,借此来去重。我们不是同一栈的去重,而是和前面所有被加入路径的元素进行去重,那就得有之前的信息,全局记录项就是恰当的。