题目来自剑指offer
题目(1):集合元素的全排列,只处理数字全不同的情况
思路:全排列属于线性递归,递归一次确定一个位置的数据,直到所有位置全被处理为止。
注意:
(1)在确定一个位置时,由于该位置的数据有多种,因此需要使用for循环。
(2)程序里面没有使用临时数组,而是通过数组元素交换的方式获得该位置的数据的。
(3)在确定一个位置时,待交换数据的起点是从该位置开始,一直到数组结束。
代码:
#include <iostream>
using namespace std;
void Swap(int& a,int& b)
{
int tmp = a;
a = b;
b = tmp;
}
void Perm(int nArr[],int nLen,int nStart)
{
if (nStart == nLen)
{
for (int i = 0;i < nLen;i++)
{
cout<<nArr[i];
}
cout<<endl;
}
for (int i = nStart;i < nLen;i++)
{
Swap(nArr[i],nArr[nStart]);
Perm(nArr,nLen,nStart + 1);
Swap(nArr[i],nArr[nStart]);
}
}
int main()
{
int nLen = 3;
int nArr[3] = {1,2,3};
Perm(nArr,nLen,0);
system("pause");
return 1;
}
题目(2):集合元素的组合,只处理数字全不同的情况
思路(1):
代码:
#include <iostream>
#include <assert.h>
using namespace std;
void Swap(int& a,int &b)
{
int tmp = a;
a = b;
b = tmp;
}
void Combine(int nArr[],int nLen,int nStart,int nNext,int nCount)
{
if (nCount == nStart)
{
for (int i = 0;i < nStart;i++)
{
cout<<nArr[i];
}
cout<<endl;
return;
}
for (int i = nNext;i < nLen;i++)
{
Swap(nArr[nStart],nArr[i]); //第nStart个位置放第i个数
Combine(nArr,nLen,nStart + 1,i + 1,nCount);//第nStart + 1 就从第i+1个数开始取。
Swap(nArr[nStart],nArr[i]);
}
}
void Combine(int nArr[],int nLen)
{
for (int nCount = 1;nCount <= nLen;nCount++)
{
Combine(nArr,nLen,0,0,nCount);
}
}
int main()
{
int nLen = 3;
int nArr[3] = {1,2,3};
Combine(nArr,nLen);
system("pause");
return 1;
}
思路(2):
代码:
#include <iostream>
#include <vector>
using namespace std;
void Print(vector<int>& nVector)
{
vector<int>::iterator itCur;
for (itCur = nVector.begin();itCur != nVector.end();itCur++)
{
cout<<*itCur;
}
cout<<endl;
}
void Combine(int nArr[],int nLen,int nStart,vector<int>& nResult,int nCount)
{
if (nStart >= nLen && nResult.size() != nCount)
{
return;
}
if (nCount == nResult.size())
{
Print(nResult);
return;
}
nResult.push_back(nArr[nStart]);
Combine(nArr,nLen,nStart + 1,nResult,nCount);
nResult.pop_back();
Combine(nArr,nLen,nStart + 1,nResult,nCount);
}
void Combine(int nArr[],int nLen)
{
vector<int> nResult;
for (int nCount = 1;nCount <= nLen;nCount++)
{
Combine(nArr,nLen,0,nResult,nCount);
}
}
int main()
{
int nLen = 3;
int nArr[3] = {1,2,3};
Combine(nArr,nLen);
system("pause");
return 1;
}
思路(3):
代码:
#include <iostream>
using namespace std;
void Swap(int& a,int& b)
{
int tmp = a;
a = b;
b = tmp;
}
void Combine(int nArr[],int nLen,int nStart,int nNext)
{
if (nStart > 0)
{
for (int i = 0;i < nStart;i++)
{
cout<<nArr[i];
}
cout<<endl;
}
for (int i = nNext;i < nLen;i++)
{
Swap(nArr[nStart],nArr[i]);
Combine(nArr,nLen,nStart + 1,i + 1);//此次,确定第nStart个位置使用的第i个元素,之后确定下一个元素时,使用的元素区间是[i + 1,nLen - 1];
Swap(nArr[nStart],nArr[i]);
}
}
int main()
{
int nLen = 3;
int nArr[3] = {1,2,3};
Combine(nArr,nLen,0,0);
system("pause");
}