思路:回溯 + 剪枝
cur_index
就是树的深度- vis数组的本质目的就是为了剪枝操作(禁止重复的数字出现)
- 如何进行回溯?
vis[i] = false; cur_permute.pop_back();
最关键之处在于:脑子里面要有树的图形
代码:
class Solution {
public:
void traceBack(vector<vector<int>> &res, vector<int> &cur_permute, int cur_index, int full_len, vector<bool> &vis, vector<int> &nums) {
if (cur_index == full_len) {
res.push_back(cur_permute);
return;
}
for (int i = 0; i < full_len; ++i) {
if (!vis[i]) {
cur_permute.push_back(nums[i]);
vis[i] = true;
// cur_index 就是树的深度
traceBack(res, cur_permute, cur_index + 1, full_len, vis, nums);
// traceBack(res, cur_permute, i + 1, full_len, vis, nums); 是有问题的
// i + 1 == 3,说明 i == 2,也就是树上以3结尾的。但是实际上我们需要层次是3的树
// 回溯操作
vis[i] = false;
cur_permute.pop_back();
}
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<int> cur_permute;
vector<bool> vis(nums.size() + 1, false);
traceBack(res, cur_permute, 0, nums.size(), vis, nums);
return res;
}
};