【算法】【搜索和回溯】Leetcode全排列
46. 全排列
题目链接:https://leetcode-cn.com/problems/permutations/
class Solution {
public:
vector<bool> flag;
vector<vector<int>> res;
vector<vector<int>> permute(vector<int>& nums) {
int n = nums.size();
flag.resize(n, false);
vector<int> path(n, -1);
dfs(nums, path, 0, n);
return res;
}
void dfs(vector<int>& nums, vector<int>& v, int u, int n)
{
if(u == n)
{
res.push_back(v);
return ;
}
for(int i = 0; i < n; i++)
if(!flag[i])
{
v[u] = nums[i];
flag[i] = true;
dfs(nums, v, u + 1, n);
flag[i] = false;
v[u] = -1;
}
}
};
47. 全排列II
题目链接:https://leetcode-cn.com/problems/permutations-ii/
class Solution {
public:
vector<bool> flag;
vector<vector<int>> res;
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
flag.resize(n, false);
vector<int> path(n, -1);
dfs(nums, path, 0, n);
return res;
}
void dfs(vector<int>& nums, vector<int>& v, int u, int n)
{
if(u == n)
{
res.push_back(v);
return ;
}
for(int i = 0; i < n; i++){
//flag[i]已经使用过了
//i - 1为了防止越界
//nums[i] == nums[i - 1]
//flag[i - 1]已经用过
//剪枝的位置:前一个元素和当前元素相同,并且前一个元素刚刚回溯,刚刚被撤销选择
if(flag[i] || (i > 0 && nums[i] == nums[i -1] && !flag[i - 1]))
continue;
v[u] = nums[i];
flag[i] = true;
dfs(nums, v, u + 1, n);
flag[i] = false;
v[u] = -1;
}
}
};
知识的价值不在于占有,而在于使用