通常我們用這兩條語句可以得到一個數(shù)組的全排列:
sort(nums.begin(),nums.end()); //調(diào)用next_permutation求全排列的時候必須先給容器排序
do{
get_pirnt(nums) //這里是一個可以打印輸出nums的函數(shù)
}while(next_permutation(nums.begin(),nums.end()); //調(diào)用該C++內(nèi)置函數(shù)可以輸出字典序大于當(dāng)前nums的所有排列。
還可以自己寫一個函數(shù)實現(xiàn)同樣的功能,下面的函數(shù)使用遞歸歇竟,每次取出當(dāng)前數(shù)組中的一個值,求出除掉它之后的數(shù)組的所有全排列抵恋,然后把它加到每一個全排列的開頭焕议。
class Solution {
public:
vector<vector<int>> solution(vector<int>& nums)
{
vector<vector<int>> res;
vector<int> one;
if(nums.size()==1) //如果數(shù)組只剩一個元素,則遞歸結(jié)束
{
one.push_back(nums[0]);
res.push_back(one);
return res;
}
for(int i=0;i<nums.size();i++) //每次從當(dāng)前nums里取第i個數(shù)
{
vector<int> row(nums.begin(),nums.end());
vector<int>::iterator index = row.begin()+i;
row.erase(index); //把第i個數(shù)從數(shù)組row里刪除
vector<vector<int>> current = solution(row); //把刪除了第i個數(shù)之后的數(shù)組進行全排列,得到current
for(int j=0;j<current.size();j++)
{ //把current里的每一行數(shù)組的開頭都加上nums[i]
vector<int>::iterator it = current[j].begin();
current[j].insert(it,nums[i]);
res.push_back(current[j]);
}
}
return res;
}
vector<vector<int>> permute(vector<int>& nums) {
return solution(nums);
}
};