LeetCode题目 46.全排列 递归回溯解法

 1 class Solution {
 2 public:
 3     vector<vector<int>> permute(vector<int>& nums) {
 4         if(nums.empty()) return {};
 5         // 存放最后结果
 6         vector<vector<int>> ans;
 7         // 存放某一个排列
 8         vector<int> temp;
 9         // 判断该数字是否被使用过
10         vector<bool> used(nums.size(),false);
11         // 进行递归求解
12         dfs(ans,temp,used,nums);
13 
14         return ans;
15     }
16 
17     void dfs(vector<vector<int>>& ans,vector<int>& temp,vector<bool>& used,
18     const vector<int>& nums)
19     {
20         // 如果当前排列数组的长度等于输入数组的长度
21         // 该排列已完成
22         // 将该排列的加入结果中,返回
23         if(temp.size()==nums.size())
24         {
25             ans.push_back(temp);
26             return;
27         }
28 
29         // 循环的进行枚举所有状态
30         for(int i=0;i<nums.size();++i)
31         {
32             // 该数字已经选择过,跳过
33             if(used.at(i)) continue;
34 
35             // 选择当前数字
36             temp.push_back(nums.at(i));
37             // 记录该数字已被选择
38             used.at(i)=true;
39             // 递归选择下一个数字
40             dfs(ans,temp,used,nums);
41             // 回溯,撤销当前选择
42             used.at(i)=false;
43             temp.pop_back();
44         }
45     }
46 };

 

posted @ 2020-04-25 12:37  悠远的苍穹  阅读(78)  评论(0)    收藏  举报