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

相关推荐
吃好睡好便好7 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
仰泳之鹅7 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
x_yeyue10 小时前
三角形数
笔记·算法·数论·组合数学
念何架构之路11 小时前
Go语言加密算法
数据结构·算法·哈希算法
AI科技星11 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
失去的青春---夕阳下的奔跑11 小时前
560. 和为 K 的子数组
数据结构·算法·leetcode
黎阳之光11 小时前
黎阳之光:以视频孪生重构智慧医院信息化,打造高标项目核心竞争力
大数据·人工智能·物联网·算法·数字孪生
丷丩12 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
m0_6294947312 小时前
LeetCode 热题 100-----25.回文链表
数据结构·算法·leetcode·链表
ʚ希希ɞ ྀ13 小时前
单词拆分----dp
算法