思路:回溯算法进行遍历,采用vis数组记录访问情况,防止后续加入的元素与之前的元素重复,当遍历到数组末尾时,加入新的排列到最终结果中。
输入:[1,2,3]
输出:[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]
初始 / | \ 1 2 3 / \ / \ / \ 2 3 1 3 1 2 | | | | | | 3 2 3 1 2 1
class Solution { private: vector<int> perm; vector<vector<int>> ans; vector<bool> vis; public: void backtrac(vector<int>& nums, int index){ if(index == nums.size()){ ans.push_back(perm); return; } for(int i = 0; i < nums.size(); i++){ if(vis[i]){ continue; } vis[i] = true; perm.push_back(nums[i]); backtrac(nums, index + 1); vis[i] = false; perm.pop_back(); } } vector<vector<int>> permute(vector<int>& nums) { int n = nums.size(); vis.resize(n,0); backtrac(nums, 0); return ans; } };