目录
[491. 非递减子序列](#491. 非递减子序列)
[46. 全排列](#46. 全排列)
[47. 全排列 II](#47. 全排列 II)
[51. N 皇后](#51. N 皇后)
491. 非递减子序列
哈希表记录重复元素
子集问题
cpp
class Solution {
vector<vector<int>>ans;
vector<int>path;
void dfs(vector<int>&nums,int start){
if(path.size()>=2)ans.push_back(path);
if(start==nums.size())return ;
unordered_map<int,int>map;
for(int i=start;i<nums.size();i++){
if(path.size()&&nums[i]<path.back())continue;
if(map[nums[i]])continue;
map[nums[i]]++;
path.push_back(nums[i]);
dfs(nums,i+1);
path.pop_back();
}
}
public:
vector<vector<int>> findSubsequences(vector<int>& nums) {
dfs(nums,0);
return ans;
}
};
46. 全排列
cpp
class Solution {
vector<vector<int>>ans;
vector<int>path;
vector<bool>vis;
void dfs(vector<int>&nums){
if(path.size()==nums.size()){
ans.push_back(path);
return ;
}
for(int i=0;i<nums.size();i++){
if(!vis[i]){
vis[i]=true;
path.push_back(nums[i]);
dfs(nums);
vis[i]=false;
path.pop_back();
}
}
}
public:
vector<vector<int>> permute(vector<int>& nums) {
vis.resize(nums.size());
dfs(nums);
return ans;
}
};
47. 全排列 II
去重:if(i&&nums[i]==nums[i-1]&&!vis[i-1])continue;
原理:排序后相同值相邻。此时两个相同值(左和右),如果选右不选左(vis记录状态),这会和另一次的选择选左不选右重复。所以排除掉选右不选左的情况
cpp
class Solution {
vector<vector<int>>ans;
vector<int>path;
vector<bool>vis;
void dfs(vector<int>&nums){
if(path.size()==nums.size()){
ans.push_back(path);
return ;
}
for(int i=0;i<nums.size();i++){
if(i&&nums[i]==nums[i-1]&&!vis[i-1])continue;
if(!vis[i]){
vis[i]=true;
path.push_back(nums[i]);
dfs(nums);
path.pop_back();
vis[i]=false;
}
}
}
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vis.resize(nums.size());
sort(nums.begin(),nums.end());
dfs(nums);
return ans;
}
};
51. N 皇后
cpp
class Solution {
void dfs(vector<vector<string>>& res, vector<int>& path, vector<bool>& vis,
int n, int x) {
if (x == n) {
vector<string> borad(n);
for (int i = 0; i < n; i++) {
string s="";
for (int j = 0; j < n; j++) {
if (path[i]==j) {
s+="Q";
} else {
s+=".";
}
}
borad[i]=s;
}
res.push_back(borad);
return;
}
for (int i = 0; i < n; i++) {
if (!vis[i]) {
bool flag = true;
for (int j = 0; j < x; j++) {
if (abs(x-j)==abs(i-path[j])) {
flag = false;
break;
}
}
if (flag) {
vis[i] = true;
path[x]=i;
dfs(res, path, vis, n, x + 1);
vis[i] = false;
}
}
}
}
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> res;
vector<int> path(n);
vector<bool> vis(n);
dfs(res, path, vis, n, 0);
return res;
}
};
