以下内容整理自leetcode题解
排列
无重复元素
问题描述
给定一个没有重复数字的序列,返回其所有可能的全排列。
比如:
对于序列[2,3,1]。
需要返回[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]。
即 P 3 3 P_{3}^{3} P33的所有可能情况。
思路
对于一个没有重复数字序列的全排列,我们应该是首先选择第一个数字,然后从剩余的数字中选择出第二个数字,直到所有的数字都被选择出来。这样我们就选择除了一个可行的排列,遍历每种选择可能即可得到所有的排列。
那么转化为递归的思路就是:
我们先选择出第一个数字,然后找到将剩余数字序列的全排列找出。即遍历第一个数字的所有可能,分别找到对应剩余数字序列的全排列,然后进行拼接。
代码
res
是返回的所有的全排列,path
是目前的排列,vis
是存储对应数字是否已使用,nums
是数字序列。
void backtrack(vector< vector<int> >& res,vector<int>& path,vector<bool>& vis,vector<int> &nums,int start) {
if (start == vis.size()) {
res.push_back(path);
return;
}
for (int i = 0; i < (int)nums.size(); ++i) {
if (vis[i]) {
continue;
}
path.emplace_back(nums[i]);
vis[i] = true;
backtrack(res, path, vis, nums,start+1);
vis[i] = false;
path.pop_back();
}
}
有重复元素
问题描述
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
比如:
对于序列[2,2,1]。
需要返回[ [1,2,2], [2,1,2], [2,2,1] ]
思路
这里对于重复数