代码随想录算法训练营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;
    }
};

相关推荐
团子的二进制世界15 分钟前
G1垃圾收集器是如何工作的?
java·jvm·算法
吃杠碰小鸡19 分钟前
高中数学-数列-导数证明
前端·数学·算法
故事不长丨19 分钟前
C#线程同步:lock、Monitor、Mutex原理+用法+实战全解析
开发语言·算法·c#
long31620 分钟前
Aho-Corasick 模式搜索算法
java·数据结构·spring boot·后端·算法·排序算法
近津薪荼21 分钟前
dfs专题4——二叉树的深搜(验证二叉搜索树)
c++·学习·算法·深度优先
熊文豪29 分钟前
探索CANN ops-nn:高性能哈希算子技术解读
算法·哈希算法·cann
熊猫_豆豆1 小时前
YOLOP车道检测
人工智能·python·算法
艾莉丝努力练剑1 小时前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
偷吃的耗子2 小时前
【CNN算法理解】:CNN平移不变性详解:数学原理与实例
人工智能·算法·cnn
dazzle2 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习