leetcode相关C++算法解答: https://github.com/Nereus-Minos/C_plus_plus-leetcode
一、不含重复元素的全排列
算法思路:
(1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀);
(2)出口:如果只有一个元素的全排列,则说明已经排完,则输出数组;
(3)不断将每个元素放作第一个元素,然后将这个元素作为前缀,并将其余元素继续全排列,等到出口,出口出去后还需要还原数组
void swap(vector<int>&a, int i, int j)
{
int temp;
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
void prem(vector<int>&a, int start, int end, vector<vector<int>>&ret)
{
if(start == end)
{
vector<int>::iterator iter;
for(iter=a.begin(); iter<a.end(); iter++)
{
cout << (*iter) << " ";
}
cout<<endl;
ret.push_back(a);
return ;
}
else
{
for(int i = start; i <= end; i++)
{
swap(a, start, i);
prem(a, sta

这篇博客详细介绍了如何使用C++实现全排列算法,包括不含重复元素和含重复元素两种情况。对于不含重复元素的全排列,博主解释了算法思路,即通过递归将一个元素作为前缀并递归排列其余元素,直到只剩一个元素时输出。而对于含重复元素的情况,博主强调了需要避免重复前缀,通过检查交换后的元素是否与前缀中的元素相同来防止重复。同时,博主给出了去重规则,确保交换的元素不会与已排列的元素相同,从而保持前缀的唯一性。
最低0.47元/天 解锁文章
423

被折叠的 条评论
为什么被折叠?



