思考:全排列的问题可以看做是一个递归来解决,[1,2,3]的数组组成全排列,可以想象提前抽出一个数字,然后剩下的n-1的数组完成全排列问题。用深度优先的方法,建立一个index数组,一开始都没有访问过,对于数组每个数字遍历,若访问过就跳过;否则就进行递归。递归回溯的时候要记得从temp_vec临时保存数组当中踢出刚刚添加的nums[i],并且把标记index[i] 置0。
我还想到,这个类似于,nums当中存放了一个图的所有节点,然后这个图是完全连通图,要我们找出所有的路径。就是从任意一个点出发,去遍历整个图,并且每个点只能出现一次。
void dfs(vector<vector<int>>&result,vector<int>&temp_vec,vector<int>& nums,vector<int>&index){
if(temp_vec.size() == nums.size()){
result.push_back(temp_vec);
return;
}
for(int i =0 ; i < nums.size();i++){
if(index[i] == 1)
continue;
index[i] = 1;
temp_vec.push_back(nums[i]);
dfs(result,temp_vec,nums,index);
temp_vec.pop_back();
index[i] = 0;
}
}
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<int> temp;
vector<int> index(nums.size(),0);
dfs(res,temp,nums,index);
return res;
}
};