题目链接
题目描述

- class Solution {
- vector
int>> ret; - vector<int> path;
- bool used[7];
- public:
- vector
int>> permute(vector<int>& nums) { - _permute(nums);
- return ret;
- }
- void _permute(vector<int>& nums){
- if(nums.size() == path.size()){
- ret.push_back(path);
- return;
- }
- for(int i = 0; i < nums.size(); ++i){
- if(used[i] == false){
- path.push_back(nums[i]);
- used[i] = true;
- _permute(nums);
- //回溯
- path.pop_back();
- used[i] = false;
- }
- }
- }
- };
1、全排类就是类似于暴搜,所有合适的组合一遍。
2、首先我我们需要一个数组path,将每次结果放到二维数组ret中。
3、其次我们在组合的过程中,有些已经用过的数字便不能参加下次的运算。因此需要使用一个used数组标识该数字是否被使用过。
4、当数字未被使用过就添加到path中,在将此数字标记为使用,即used[i]=true,进入下一轮组合。回溯的时候,就将该数字从path中移除,并将该数字标记为false。
5、最后考虑递归出口,当path中的元素和nums中的元素个数相等时,即可将path添加到ret二维数组中,再return。
如下决策树,只画了部分,仅供参考。
