力扣-46-全排列
Posted xiazhenbin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣-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; } };
以上是关于力扣-46-全排列的主要内容,如果未能解决你的问题,请参考以下文章
力扣算法JS LC [46. 全排列] LC [47. 全排列 II]