Given a collection of numbers, return all possible permutations.
For example,
[1,2,3]
have the following permutations:
[1,2,3]
, [1,3,2]
, [2,1,3]
, [2,3,1]
, [3,1,2]
, and [3,2,1]
.
solution: 递归方法实现,从第0位开始,先交换当前位和后续1 到最后中的每个数,然后递归之。
class Solution {
public:
void swap(vector<int> &num, int i, int j)
{
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
void per(vector< vector<int> >&res, vector<int> &num, int cur, int len)
{
if(cur == len)
{
res.push_back(num);
return;
}
for(int i = 0; i < len - cur; i++)
{
swap(num, cur, cur+i);
per(res, num, cur+1, len);
swap(num, cur, cur+i);
}
}
vector<vector<int> > permute(vector<int> &num) {
// Note: The Solution object is instantiated only once and is reused by each test case.
vector< vector<int> >res;
vector<int> result;
if(num.size() <= 0)
return res;
int len = num.size();
per(res, num, 0, len);
return res;
}
};
在论坛上找到这样的代码,原理是相同的,由于引入了bool值的数组来标识已访问的数字,这样不需要改变原来数组,可靠性更强些,但由于每次递归都会做一次n的循环,所以效率会低。但该方法在实现permutations II 的时候显得很好用,所以sign下。
class Solution {
public:
vector<vector<int> > permute(vector<int> &num) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<int> > ans;
if(num.size<()=0) return ans;
vector<int> s;
vector<bool> used(num.size(), false);
permuteRec(num, s, used, ans);
return ans;
}
void permuteRec(vector<int> &num, vector<int> &s, vector<bool> &used,
vector<vector<int> > &ans)
{
if(s.size()==num.size())
{
ans.push_back(s);
return;
}
for(int i=0; i<used.size(); i++)
{
if(!used[i])
{
s.push_back(num[i]);
used[i]=true;
permuteRec(num, s, used, ans);
used[i]=false;
s.pop_back();
}
}
}
};