总体思路:回溯算法,每次遍历选择一个数,确定一个数后再递归确定其他的数。这里递归使用深度优先搜索,在到达叶子节点后,返回的过程其实就是回溯。此处使用used数组标记哪些元素已经被访问过。
class Solution {
public:
vector<int> path;
vector<vector<int>> res;
vector<vector<int>> permute(vector<int>& nums) {
vector<bool> used(nums.size(), false);
backtracking(nums, used);
return 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;
}
}
};