LeetCode——第二十一天
46.全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
分析:全排列,不会做,唉。看了一眼回溯法,瞬间去复习了一下,只怪之前没有好好学。
回溯简单方法
class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> permute(vector<int>& nums) {
vector<int> track;
backtrack(nums, track);
return res;
}
void backtrack(vector<int> nums, vector<int> track) {
//找个一组,则返回,开始撤销上一个加入的元素
if(track.size() == nums.size()) {
res.emplace_back(track);
return;
}
for(int i = 0; i <nums.size(); ++ i) {
//判断是否该数是否加入过,没有则加入,有则下一个
if(find(track.begin(), track.end(), nums[i]) == track.end()) {
track.emplace_back(nums[i]); //加入元素
backtrack(nums, track); //继续添加
track.pop_back(); //撤销
}
}
}
};
这里是递归,但好理解。下面官方的,直接贴图给你们看吧,很精彩。
这里主要思路就是左右,左边当成已经排好,右边未排,然后交换,撤销的时候同样交换即可,不太懂跟着代码模拟一遍就知道了。
官方代码
class Solution {
public:
void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){
// 所有数都填完了
if (first == len) {
res.emplace_back(output);
return;
}
for (int i = first; i < len; ++i) {
// 动态维护数组
swap(output[i], output[first]);
// 继续递归填下一个数
backtrack(res, output, first + 1, len);
// 撤销操作
swap(output[i], output[first]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int> > res;
backtrack(res, nums, 0, (int)nums.size());
return res;
}
};
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/permutations/solution/quan-pai-lie-by-leetcode-solution-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。