46. 全排列

给定一个 没有重复 数字的序列,返回其所有可能的全排列。 示例:

输入:[1,2,3]
输出:[ [1,2,3], [1,3,2], [2,1,3],[2,3,1],[3,1,2],[3,2,1] ]

解题思路

image.png
代码实现

  1. class Solution {
  2. public:
  3. vector<int> sortNums;//原始序列的排序
  4. vector<vector<int>> res;//存储最后结果
  5. vector<int> solveOne;//一个全排列
  6. vector<int> used;//标记位置i的元素是否被使用过
  7. int len;
  8. vector<vector<int>> permute(vector<int>& nums) {
  9. len = nums.size();
  10. sortNums = nums;
  11. sort(sortNums.begin(),sortNums.end());//排序与否不影响最后结果
  12. for(int i = 0;i < len;i++) used.push_back(false);
  13. recurDep();
  14. return res;
  15. }
  16. void recurDep(){
  17. if(solveOne.size() == len){
  18. res.push_back(solveOne);
  19. return;
  20. }
  21. for(int i = 0;i < len;i++) {
  22. if(!used[i]){
  23. solveOne.push_back(sortNums[i]);
  24. used[i] = true;//标记为已经使用过了
  25. recurDep();//往下一层递归
  26. //撤销选择,回退
  27. solveOne.pop_back();
  28. used[i] = false;
  29. }
  30. }
  31. }
  32. };