1.思路
递归+回退,难以理解就手动模拟看代码先熟悉吧
2.代码
class Solution { public: vector<vector<int>> res; vector<int> visited; vector<int> path; void backtrack(vector<int> &nums){ if(path.size()==nums.size()){ // 当前路径=数组元素,加入结果 res.push_back(path); return ; } //循环遍历每个数当前是否被访问 //visited[i] 表示元素nums[i]是否被访问 for(int i = 0;i<nums.size();i++){ if(visited[i]==0){ visited[i]=1; path.push_back(nums[i]); backtrack(nums); visited[i]=0;//回溯,使得visited[2] = 0,3回退,{1,2},注意!继续进入上一层递归进行后续的for循环! path.pop_back(); } } } vector<vector<int>> permute(vector<int>& nums) { visited.resize(nums.size(),0);//0表示未访问 backtrack(nums); return res; } };