1,题目要求
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]
]
给定一组不同的整数,返回所有可能的排列。
2,题目思路
对于这道题,需要求一个数组的全排列。全排列的概念非常好理解,人为的去写也不是非常困难,但是用代码实现就有点困难了。
在实现上,递归实现是一个解决办法。很简洁和难以理解的方法,typical recursive。
另外一种方法,则是直接使用C++内置函数:
next_permutation(nums.begin(), nums.end())
这个函数的作用,就是对nums进行一个按顺序的全排列,其排列的逻辑与第一部分的例子是一致的,于是,像“3,2,1”这种顺序,就属于不可进行排列的,返回false。
3,代码实现
1,递归实现(回溯)
class Solution {
public:
vector<vector<int> > permute(vector<int> &num) {
vector<vector<int> > result;
permuteRecursive(num, 0, result);
return result;
}
// 对num[begin..end]进行全排列
// 此时num[0..begin-1]已经全排列了
void permuteRecursive(vector<int> &num, int begin, vector<vector<int> > &result) {
if (begin >= num.size()) {
//当begin到达结尾时
//说明此时实现了一个全排列
//将其加入到结果中即可
result.push_back(num);
return;
}
for (int i = begin; i < num.size(); i++) {
swap(num[begin], num[i]);
permuteRecursive(num, begin + 1, result);
//将交换的数字复位
swap(num[begin], num[i]);
}
}
};
2,C++内置函数next_permutaion
int x = []() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
return 0;
}();
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
sort(nums.begin(), nums.end());
do{
res.push_back(nums);
}while(next_permutation(nums.begin(), nums.end()));
return res;
}
};