力扣上的两个全排列的题目
题目描述: 给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
permutation(res,nums,0,nums.size());
return res;
}
void permutation(vector<vector<int>>& re, vector<int> cur,int k,int m)
{
if (k == m)
re.push_back(cur);
else
{
for (int i = k; i < m;++i)
{
sort(&cur[k],&cur[m]);//因为题目测试用例中,结果是按字典序输出,所以这里用了sort排序
swap(cur[k],cur[i]);//经典的递归案例,记住!!!
permutation(re,cur, k+1,m);
swap(cur[k],cur[i]);
}
}
}
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
};
下面是含有重复元素的情况,只是增加了一个去重的函数~!
全排列II(包含重复数字)
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> res;
permutation(res,nums,0,nums.size());
return res;
}
void permutation(vector<vector<int>>& re, vector<int> cur,int k,int m)
{
if (k == m)
re.push_back(cur);
else
{
for (int i = k; i < m;++i)
{
sort(&cur[k],&cur[m]);//因为题目测试用例中,结果是按字典序输出,所以这里用了sort排序
if (HasDuplicate(cur,k,i))//如果没有重复才继续进行,i值加1,进入下一轮循环!
{
swap(cur[k],cur[i]);//经典的递归案例,记住!!!
permutation(re,cur, k+1,m);
swap(cur[k],cur[i]);
}
}
}
}
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
bool HasDuplicate(vector<int> check, int st, int en)
{
for (int i = st; i < en; ++i)
{
if (check[i] == check[en])
return false;
}
return true;
}
};