主要的思想(深度優先搜索)和我這篇博客一樣:找出1到n所有不重複的排列,即n的全排列
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
class Solution {
void fun(vector<int> &nums, vector<bool> &appear, vector<int> &method, vector<vector<int>> &res)
{
int n = nums.size();
//如果得到一種滿足題意的情況,則保存下來
if (n == method.size())
{
res.push_back(method);
return;
}
for (int i=0;i<n;++i)
{
//如果第i個數沒有出現過,則放到method中,然後遞歸放下一個數
if (!appear[i])
{
method.push_back(nums[i]);
appear[i] = true;
fun(nums, appear, method, res);
//回溯
method.pop_back();
appear[i] = false;
}
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
int n = nums.size();
//appear 記錄n個數的出現情況
vector<bool> appear(n,false);
//保存最終的結果
vector<vector<int>> res;
//保存當前的某一種滿足題意的情況
vector<int> method;
fun(nums, appear, method, res);
return res;
}
};
int main()
{
Solution s;
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
vector<vector<int>> res = s.permute(v);
//輸出結果
for (vector<vector<int>>::iterator ita=res.begin();ita!=res.end();++ita)
{
for (vector<int>::iterator itb=ita->begin();itb!=ita->end();++itb)
{
cout<<*itb<<'\t';
}
cout<<endl;
}
return 0;
}
updata 2016.07.14
今天看到這種類型題目的新解法,於是用運用到該題上。運行了下,效率比第一種高不少。
解法二
思想:求整個數組的全排列可以分成兩步:(1)求所有可能出現在第一個位置的數字;(2)固定第一個數字,求後面數字的全排列。這時,求後面數字的全排列我們仍把後面的所有數字分如上兩步走,…
C++代碼:
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
//求nums中,下標從i_begin到nums.size()-1的全排列
void permution(vector<int>& nums, int i_begin, vector<vector<int>> &res)
{
//如果到達末尾,則保存這一排列
if (i_begin == nums.size()-1)
res.push_back(nums);
else
{
for (int i=i_begin;i<nums.size();++i)
{
//交換下標爲i_begin和i的元素
int tmp = nums[i];
nums[i] = nums[i_begin];
nums[i_begin] = tmp;
//遞歸求剩下元素的全排列
permution(nums, i_begin+1, res);
//回溯時,復原下標爲i_begin和i的元素
tmp = nums[i];
nums[i] = nums[i_begin];
nums[i_begin] = tmp;
}
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
if (nums.size())
{
permution(nums, 0, res);
}
return res;
}
};
int main()
{
Solution s;
vector<int> v;
for (int i=1;i<=3;++i)
{
v.push_back(i);
}
vector<vector<int>> res = s.permute(v);
for (vector<vector<int>>::iterator ita=res.begin();ita!=res.end();++ita)
{
for (vector<int>::iterator itb=ita->begin();itb!=ita->end();++itb)
{
cout<<*itb<<' ';
}
cout<<endl;
}
return 0;
}