Permutations / Permutations II
方法:采用递归的方式
class Solution { public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> result; vector<bool> visit(nums.size(), false); vector<int> path; dfs(nums, path, visit, result); return result; } private: void dfs(const vector<int> &nums, vector<int> &path, vector<bool> &visit, vector<vector<int>> &result) { if(path.size() == nums.size()) { result.push_back(path); return; } for(int i=0; i<nums.size(); ++i) { if(!visit[i]) { visit[i] = true; path.push_back(nums[i]); dfs(nums, path, visit, result); visit[i] = false; path.pop_back(); } } } };
或者使用查找的方式代替visit参数
class Solution { public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> result; vector<int> path; dfs(nums, path, result); return result; } private: void dfs(const vector<int> &nums, vector<int> &path, vector<vector<int>> &result) { if(path.size() == nums.size()) { result.push_back(path); return; } for(int i=0; i<nums.size(); ++i) { if(find(path.begin(), path.end(), nums[i]) == path.end()) { path.push_back(nums[i]); dfs(nums, path, result); path.pop_back(); } } } };
对于Permutations II,只需判断现在访问到的数字与前一个是否相同即可。
class Solution { public: vector<vector<int>> permuteUnique(vector<int>& nums) { sort(nums.begin(), nums.end()); vector<vector<int>> result; vector<bool> visit(nums.size(), false); vector<int> path; dfs(nums, path, visit, result); return result; } private: void dfs(const vector<int> &nums, vector<int> &path, vector<bool> &visit, vector<vector<int>> &result) { if(path.size() == nums.size()) { result.push_back(path); return; } for(int i=0; i<nums.size(); ++i) { if(i > 0 && nums[i] == nums[i-1] && visit[i-1]) continue; if(!visit[i]) { visit[i] = true; path.push_back(nums[i]); dfs(nums, path, visit, result); visit[i] = false; path.pop_back(); } } } };
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号