思路:回溯 + 剪枝
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; }};