代码随想录算法训练营DAY25第七章 回溯算法 part04

目录

[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;
    }
};

相关推荐
IronMurphy4 小时前
【算法四十三】279. 完全平方数
算法
墨染天姬4 小时前
【AI】Hermes的GEPA算法
人工智能·算法
papership4 小时前
【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】
数据结构·算法·链表
smj2302_796826524 小时前
解决leetcode第3911题.移除子数组元素后第k小偶数
数据结构·python·算法·leetcode
Beginner x_u5 小时前
链表专题:JS 实现原理与高频算法题总结
javascript·算法·链表
_深海凉_8 小时前
LeetCode热题100-寻找两个正序数组的中位数
算法·leetcode·职场和发展
踩坑记录9 小时前
leetcode hot100 寻找两个正序数组的中位数 hard 二分查找 双指针
leetcode
旖-旎9 小时前
深搜练习(电话号码字母组合)(3)
c++·算法·力扣·深度优先遍历
谭欣辰9 小时前
C++快速幂完整实战讲解
算法·决策树·机器学习
Mr_pyx9 小时前
【LeetHOT100】随机链表的复制——Java多解法详解
算法·深度优先