您的位置:首页 > 编程语言 > C语言/C++

leetcode #46 in cpp

2016-05-28 04:32 357 查看
Given a collection of distinct 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: 

recurrent structure: 

permutation of [1,2,3] = [1 , permutation(2,3)]  and [2, permutation[1,3]] and [3, permutation(1,2)]; 

Code: 

class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<int> members;
find_permutation(members, nums, &res);
return res;
}

void find_permutation(vector<int> members, vector<int> nums, vector<vector<int>> *res){
if(nums.size() == 1){
members.push_back(nums[0]);
res->push_back(members);
return;
}
for(int i = 0; i < nums.size(); i ++){
int temp = nums[i];
members.push_back(temp);//separate one number out of the array
nums.erase(nums.begin() + i);
find_permutation(members, nums, res);//find the permutation of the rest of numbers
nums.insert(nums.begin() + i, temp);
members.pop_back();
}
};
};

If we modify the code a little bit, we could abandon the use of 'members' and use less memory by using an index indicating where the permutation begins.

Code : 

class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
find_permutation(0, nums, &res);
return res;
}

void find_permutation(int start, vector<int> nums, vector<vector<int>> *res){
if(start == nums.size() - 1){
res->push_back(nums);
return;
}
for(int i = start; i < nums.size(); i ++){
swap(nums[i], nums[start]);
find_permutation(start + 1, nums, res);
swap(nums[i], nums[start]);
}
};

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: