这里采用,方格填数法,与数学排列组合方法相同。需要借助O(N)的空间标记已经选择过的数,但最容易理解。
class Solution {
private:
vector<int> vis;
vector<vector<int>> res;
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<int> perm;
vis.resize(nums.size());
backtrack(nums, 0, perm);
return res;
}
void backtrack(vector<int>& nums, int idx, vector<int>& perm) {
if (idx == nums.size()) {
res.emplace_back(perm);
return;
}
for (int i = 0; i < nums.size(); i++) {
if (vis[i] == 1) continue;
perm.emplace_back(nums[i]);
vis[i] = 1;
backtrack(nums, idx + 1, perm);
vis[i] = 0;