力扣-46-全排列
给定一个没有重复数字的数列,输入该数列的全排列。
这是一道回溯法(递归思想)的题目,可以通过递归来枚举所有的排列组合,为了避免重复使用某个数字,可以用flag标记每个数字是否使用。
代码方面,回溯法的框架如下,细品:
result = [] def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列表) 撤销选择
/*递归*/ #include <cstring> #include <string.h> #include <algorithm> using namespace std; class Solution { private: vector<int> path; /*记录排列的path*/ vector<int> nums; vector<vector<int> > res; /*全排列结果*/ int flag[1005]; public: void dfs(int num){ if (num == 0){ /*num表示差num个数字就形成一个排列*/ res.push_back(path); return ; } for(int i = 0; i < nums.size(); i++){ if(flag[i]) continue; flag[i] = 1; path.push_back(nums[i]); dfs(num - 1); path.pop_back(); flag[i] = 0; } } vector<vector<int>> permute(vector<int>& nums) { this->nums = nums; memset(flag, 0, sizeof(flag)); dfs(nums.size()); return res; } };
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!