代码随想录算法训练营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&&numsi==numsi-1&&!visi-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;
    }
};

相关推荐
圣保罗的大教堂2 小时前
leetcode 1401. 圆和矩形是否有重叠 中等
leetcode
qq_410194292 小时前
.NET 8.0 下基于 PaddleOCRSharp 的离线文字识别落地指南
算法·.net
Omics Pro2 小时前
1个月2轮融资!长寿虚拟细胞
数据库·人工智能·算法·机器学习·自然语言处理
residual_fan2 小时前
航空发动机故障诊断专用智能体(六):实际机队健康管理中的应用考量与展望
人工智能·算法·数据挖掘·数据分析
hansang_IR3 小时前
【讲解】CSP-S2026 第一轮初赛
c++·算法
hanlin033 小时前
刷题笔记:力扣第76题-最小覆盖子串
笔记·算法·leetcode
Zane19943 小时前
比较排序跑不出O(nlogn)是数学上证明过的,计数、桶、基数排序凭什么能绕开这堵墙
算法·排序算法
tiger8653 小时前
大语言模型面试和题解,梳理中国主流开源 LLM 系列的发展脉络、技术路线与工程取舍
人工智能·gpt·深度学习·算法·自然语言处理·面试·transformer
我不会起名字3223 小时前
一天一道力扣Hot100(36):深度优先算法---组合总和
数据结构·c++·后端·python·算法·go
虚无的纽扣4 小时前
【力扣刷题】第三天:有效三角形的个数、快乐数
算法·排序算法