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].
//#46 Permutations
//20ms 28.12%
class Solution {
public:
int getFactorial(int n)
{
if(n==1 || n==0) return 1;
else return n*getFactorial(n-1);
}
vector<int> permuteOne(vector<int> n, int k)
{
vector<int> result;
vector<int> nums(n.size(), 0);
for(unsigned int i=0; i<n.size(); i++)
{
nums[i] = n[i];
}
for(unsigned int i=0; i<n.size(); i++)
//determine the corresponding item one by one
{
//cout << "Current session is " << n-i << endl;
//cout << "k = " << k << endl;
int insert_num = (k-1) / getFactorial(n.size()-i-1);
//cout << "insert_num = " << insert_num << endl;
if(insert_num > 0)
{
result.push_back(nums[insert_num]);
//cout << "inserting " << nums[insert_num] << " into string\n";
nums.erase(nums.begin()+insert_num);
k = k - insert_num * getFactorial(n.size()-i-1);
}
else
{
result.push_back(nums[0]);
nums.erase(nums.begin());
}
}
return result;
}
vector< vector<int> > permute(vector<int>& nums)
{
vector< vector<int> > result;
int n = getFactorial(nums.size());
for(int i=0; i<n; i++)
{
vector<int> v = permuteOne(nums, i+1);
result.push_back(v);
}
return result;
}
};