自己写的:
虽然题目要求了排序,但是我没排序也可以通过。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型vector
* @return int整型vector<vector<>>
*/
vector<vector<int> > ans;
vector<int> flag;
void dfs(vector<int>num, int index, vector<int>ans_single){
ans_single.push_back(num[index]);
if(ans_single.size() == num.size()){
ans.push_back(ans_single);
return;
}
flag[index] = 1;
for(int i = 0; i < num.size(); i ++){
if(flag[i] != 1) // 没有被访问过
dfs(num, i, ans_single);
}
flag[index] = 0;
}
vector<vector<int> > permute(vector<int>& num) {
// write code here
for(int i = 0; i < num.size(); i++)
flag.push_back(0);
vector<int> ans_single;
for(int i = 0; i < num.size(); i++) // 直接dfs(num, 0, ans_single)会只递归1开头的树,不递归2开头的和3开头的。
dfs(num, i, ans_single);
return ans;
}
};
为了主函数直接调用,优化了一下:
- 之前的dfs的参数是2个。回溯的时候,flag回溯。
- 现在的dfs的参数是2个。回溯的时候,flag和ans_single都要回溯。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型vector
* @return int整型vector<vector<>>
*/
vector<vector<int> > ans;
vector<int> flag;
void dfs(vector<int>num, vector<int>ans_single){
if(ans_single.size() == num.size()){
ans.push_back(ans_single);
return;
}
for(int i = 0; i < num.size(); i ++){
if(flag[i] != 1) { // 没有被访问过
flag[i] = 1; //放在for循环的里面
ans_single.push_back(num[i]);
dfs(num, ans_single);
ans_single.pop_back(); //调试很久,忘记回溯
flag[i] = 0; //回溯
}
}
}
vector<vector<int> > permute(vector<int>& num) {
// write code here
for(int i = 0; i < num.size(); i++)
flag.push_back(0);
vector<int> ans_single;
dfs(num, ans_single);
return ans;
}
};
模板的:
没有全局变量。
我的有,需要全局变量记录是否访问过。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num int整型vector
* @return int整型vector<vector<>>
*/
void dfs(vector<vector<int>> &res, vector<int> &num, int index){
if(index == num.size()-1){
res.push_back(num);
return;
}
for(int i = index; i < num.size(); i++){
swap(num[index],num[i]);
dfs(res, num, index+1);
swap(num[index],num[i]); //回溯
}
}
vector<vector<int> > permute(vector<int>& num) {
// write code here
vector<vector<int> > res;
// sort(num.begin(),num.end());
dfs(res,num,0);
return res;
}
};