今天状态不是很好,刷了一道正好是当时面试被问到的题目,下面就和大家分享一下经验吧!
题目如下:
Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3]
Output:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
题意分析:
给定一个包含不同整数的集合,请返回它的全排列。
方法一(递归回溯法)
与“https://blog.csdn.net/Vensmallzeng/article/details/96103159”的方法一的思路相同,不过以下几点区别:
① 在同一排列中,用过的数字不能重复使用,但在不同的排列中,用过的数字可以再次使用;
② 对于数字应该用push_back方式予以累加;
解题代码如下:
class Solution{
private:
vector<vector<int>> res;
vector<bool> used;
void Findpermute(vector<int>& nums, int k, vector<int>& temp){
if (k==nums.size())
{res.push_back(temp);
return;}
for (int i = 0; i < nums.size(); i++) {
if (!used[i]){
temp.push_back(nums[i]);
used[i] = true;
Findpermute(nums, k+1,temp);
temp.pop_back();
used[i] = false;
}
}
return;
}
public:
vector<vector<int>> permute(vector<int>& nums){
if(nums.size()==0) return res;
used = vector<bool>(nums.size(), false);
vector<int> temp;
Findpermute(nums, 0,temp);
return res;
}
};
提交后的结果如下:
方法二(递归交换法)
通过每次递归调用,交换nums里面的两个数字可以生成所有的排列情况。该方法写起来更简洁。
解题代码如下:
class Solution{
public:
vector<vector<int>> permute(vector<int> nums) {
vector<vector<int>> res;
if (nums.size() == 0) return res;
Findpermute(nums, 0, res);
return res;
}
void Findpermute(vector<int> nums, int start, vector<vector<int>>& res){
if(start == nums.size()) {
res.push_back(nums);
return;
}
for (int i = start; i < nums.size(); i++) {
swap(nums[start], nums[i]);
Findpermute(nums, start+1, res);
swap(nums[start], nums[i]);
}
}
};
提交后的结果如下:
日积月累,与君共进,增增小结,未完待续。