leetcode 46. 全排列
很经典很经典,虽然AC高但难度不小
/** 当前的排列结果level,总结果res,访问标志visit, 边界,level达到n个数 **/ class Solution { public: vector<vector<int>> permute(vector<int>& nums) { if(nums.size()==0) return {}; int len=nums.size(); vector<vector<int>> res; vector<int> level; vector<int> visit(len,0); dfs(nums,res,level,visit); return res; } void dfs(vector<int>&nums,vector<vector<int>>&res,vector<int>&level,vector<int>&visit){ if(level.size()==nums.size()){ res.push_back(level);return; } for(int i=0;i<nums.size();i++){ if(!visit[i]){ visit[i]=1; level.push_back(nums[i]); dfs(nums,res,level,visit); visit[i]=0; level.pop_back(); } } } };
采用深度优先搜索的代码(带注释)
class Solution { public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> res; vector<int> temp,visited(nums.size(),0); sort(nums.begin(),nums.end()); DFS(nums,0,visited,temp,res); return res; } void DFS(vector<int>& nums,int index,vector<int>& visited,vector<int>& temp,vector<vector<int>>& res){ //递归边界,当一个排列的数达到n个后,即形成了一个排列 if(index==nums.size()){res.push_back(temp);return;} //递归形式:输出以nums[i]为第一个数的所有排列, for(int i=0;i<nums.size();i++){ if(visited[i]==0){ temp.push_back(nums[i]); visited[i]=1; //递归调用时,输出前(index+1)个数确定的所有排列 DFS(nums,index+1,visited,temp,res); //递归调用时,前(index+1)个数确定的所有排列输出完成,将后面所用到的元素visited设为0,并将temp中第(index+1)个数删除,然后按顺序继续加入下一个没有被添加到temp中的数 temp.pop_back(); visited[i]=0; } } } };