题目链接:LeetCode 46. 全排列
题意:
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解题思路:
直接dfs,只需判断当前数字是否被使用过
class Solution {
private:
vector<vector<int>> ans;
int n;
public:
void dfs(vector<int>& nums, vector<int>& v, vector<bool>& flag) {
if(v.size() == n) {
ans.push_back(v);
return ;
}
for(int i = 0; i < n; i++) {
if(flag[i]) {
flag[i] = false; // 判断当前数字是否被使用过
v.push_back(nums[i]);
dfs(nums, v, flag);
flag[i] = true;
v.pop_back();
}
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<int> v;
n = nums.size();
vector<bool> flag(n, true);
dfs(nums, v, flag);
return ans;
}
};
2.交换写法
class Solution {
private:
vector<vector<int>> ans;
int n;
public:
void dfs(vector<int>& output, int first) {
if(first == n) {
ans.emplace_back(output);
}
for(int i = first; i < n; i++) {
swap(output[i], output[first]); // 由于没有重复的数字,所以交换之后肯定是一种新的排序
dfs(output, first+1);
swap(output[i], output[first]); // 修改回去
}
}
vector<vector<int>> permute(vector<int>& nums) {
n = nums.size();
dfs(nums, 0);
return ans;
}
};

本文详细解析了LeetCode第46题“全排列”的解题思路及实现方法,采用两种不同的DFS(深度优先搜索)策略完成求解,一种通过标记已使用的数字,另一种则利用交换技巧生成不同序列。
1865

被折叠的 条评论
为什么被折叠?



