22.回溯算法4

news/2025/2/24 17:12:57

递增子序列

这里不能排序,因为数组的顺序是对结果有影响的,所以只能通过used数组来去重

class Solution {
public:
    vector<int> path;
    vector<vector<int>> res;
    void backtracking(vector<int>& nums,int start){
        if(path.size()>1)
        res.push_back(path);
        int used[201]={0};
        for(int i=start;i<nums.size();i++){
           
            if(path.empty()||nums[i]>=path[path.size()-1]){
                if(used[nums[i]+100])continue;;
                path.push_back(nums[i]);
                used[nums[i]+100]=1;
                backtracking(nums,i+1);
                path.pop_back();
                
            }
        }
    }
    vector<vector<int>> findSubsequences(vector<int>& nums) {
        backtracking(nums,0);
        return res;
    }
};

全排列

class Solution {
public:
    vector<int> path;
    vector<vector<int>> res;
    int* used;
    int level=0;
    void backtracking(vector<int>& nums){
        if(level==nums.size()){
            res.push_back(path);
            return;
        }
        for(int i=0;i<nums.size();i++){
            if(used[i])continue;
            path.push_back(nums[i]);
            level++;
            used[i]=1;
            backtracking(nums);
            path.pop_back();
            used[i]=0;
            level--;
            
        }
        
    }
    vector<vector<int>> permute(vector<int>& nums) {
        used= new int[nums.size()]{0};
        backtracking(nums);
        return res;
    }
};

全排列2

class Solution {
public:
    vector<int> path;
    vector<vector<int>> res;
    int* used;
    int level=0;
    void backtracking(vector<int>& nums){
        if(level==nums.size()){
            res.push_back(path);
            return;
        }
        int pre=20040503;
        for(int i=0;i<nums.size();i++){
            if(used[i])continue;
            if(nums[i]==pre)continue;
            path.push_back(nums[i]);
            level++;
            used[i]=1;
            pre=nums[i];
            backtracking(nums);
            path.pop_back();
            used[i]=0;
            level--;
            
        }
        
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        used= new int[nums.size()]{0};
        sort(nums.begin(),nums.end());
        backtracking(nums);
        
        return res;
    }
};

重新安排行程

class Solution {
    public:
    unordered_map<string,map<string,int>> targets;
    vector<string> res; 
    int tiknum;
    vector<string> backtracking(int stop,string start){
        if(stop==tiknum)return res;
        vector<string> tmp;
        for(auto it:targets[start]){
            if(it.second){
                res.push_back(it.first);
                targets[start][it.first]--;
            }
            else continue;
            tmp=backtracking(stop+1,it.first);
            if(!tmp.empty())return tmp;
            res.pop_back();
            targets[start][it.first]++;
        }
        return tmp;
    }
    vector<string> findItinerary(vector<vector<string>>& tickets) {
        for(auto tick:tickets){
            targets[tick[0]][tick[1]]++;
        }
        tiknum=tickets.size();
        res.push_back("JFK");
        return backtracking(0,"JFK");
    }
};

N皇后

class Solution {
public:
    vector<string> tmp;
    vector<vector<string>> res;
    int n;
    bool isConf(int y,int x){
        for(int i=1;i<=y;i++){
            if(tmp[y-i][x]=='Q')return 1;
            if(x+i<n&&tmp[y-i][x+i]=='Q')return 1;
            if(x-i>=0&&tmp[y-i][x-i]=='Q')return 1;
        }
        return 0;
    }
    void backtracking(int k){
        if(k==n){
            res.push_back(tmp);
        }
        for(int i=0;i<n;i++){
            if(isConf(k,i))continue;
            tmp[k][i]='Q';
            backtracking(k+1);
            tmp[k][i]='.';
        }
    }
    vector<vector<string>> solveNQueens(int n0) {
        n=n0;
        tmp.resize(n);
        for(int i=0;i<n;i++){
            tmp[i].resize(n);
            for(int j=0;j<n;j++){
                tmp[i][j]='.';
            }
        }
        backtracking(0);
        return res;    
    }
};
  • 时间复杂度: O(n!)
  • 空间复杂度: O(n)

解数独

class Solution {
public:
    
    bool isValid(int row, int col, char val,vector<vector<char>>& board) {
    for (int i = 0; i < 9; i++) { // 判断行里是否重复
        if (board[row][i] == val) {
            return false;
        }
    }
    for (int j = 0; j < 9; j++) { // 判断列里是否重复
        if (board[j][col] == val) {
            return false;
        }
    }
    int startRow = (row / 3) * 3;
    int startCol = (col / 3) * 3;
    for (int i = startRow; i < startRow + 3; i++) { // 判断9方格里是否重复
        for (int j = startCol; j < startCol + 3; j++) {
            if (board[i][j] == val ) {
                return false;
            }
        }
    }
    return true;
}
    bool backtracking(int x,int y,vector<vector<char>>& board){
        int n=board.size();
        if(x>=n){
            x=x%n;
            y++;
            
        }
        while(x<n&&y<n){
            if(board[y][x]!='.'){
                x++;
                if(x>=n){
                    x=x%n;
                    y++;
                    
                }
                continue;
            }
            for(int i=1;i<10;i++){
                if(!isValid(y,x,i+'0',board))continue;
                board[y][x]=i+'0';           
                if(backtracking(x+1,y,board))return 1;
                board[y][x]='.';
            }
            return 0;
        }
        return 1;
    }
    void solveSudoku(vector<vector<char>>& board) {
        backtracking(0,0,board);
    }
};

http://www.niftyadmin.cn/n/5864632.html

相关文章

“国补”带火手机换新,出售旧手机应如何保护个人信息安全

在“国补”政策的推动下,手机换新热潮正席卷而来。“国补”以其诱人的补贴力度,成功激发了消费者更换手机的热情。无论是渴望体验最新技术的科技爱好者,还是对旧手机性能不满的普通用户,都纷纷投身到这场手机换新的浪潮之中。 随着大量消费者参与手机换新,二手手机市场迎来…

机器学习数学通关指南——拉格朗日乘子法

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一句话总结 拉格朗日乘子法…

Python采用DeepSeekR1本地部署+本地API接口实现简单对话

以下内容摘抄自 【Ai】— DeepSeek-r1 版本选择(超详细)https://blog.csdn.net/weixin_44205779/article/details/145479506 Ollama:零代码部署大模型,轻松玩转AIhttps://blog.csdn.net/scy799327210/article/details/145798396 大模型 ollama命令详解大全https://blog.…

DeepSeek学习教程 从入门到精通pdf下载:快速上手 DeepSeek

下载链接&#xff1a;DeepSeek从入门到精通(清华大学).pdf 链接: https://pan.baidu.com/s/1Ym0-_x9CrFHFld9UiOdA5A 提取码: 2ebc 一、DeepSeek 简介 DeepSeek 是一款由中国团队开发的高性能大语言模型&#xff0c;具备强大的推理能力和对中文的深刻理解。它广泛应用于智能办…

P8716 [蓝桥杯 2020 省 AB2] 回文日期

1 题目说明 2 题目分析 暴力不会超时&#xff0c;O(n)的时间复杂度&#xff0c; < 1 0 8 <10^8 <108。分析见代码&#xff1a; #include<iostream> #include<string> using namespace std;int m[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};// 判断日期…

MobaXterm_Portable_v23.2 免费下载与使用教程(附安卓替代方案)

一、MobaXterm_Portable 简介 MobaXterm 是一款功能强大的全能终端工具&#xff0c;支持 SSH、SFTP、RDP、VNC、X11 转发 等多种协议&#xff0c;集成了终端、文件传输、远程桌面等功能。其便携版&#xff08;Portable Edition&#xff09;无需安装&#xff0c;解压即可使用&a…

escape SQL中用法

select * from tablename where username like %#%% escape # 这个的意思就是&#xff0c;escape指定字符#&#xff0c;#字符后面的第一个字符被认为是普通字符 查询示例2 查询username字段中包含[的数据也是一样&#xff0c;即&#xff1a; select * from tablename where us…

Java使用Redisson实现布隆过滤器

1. 布隆过滤器基础理论 1.1 原理 布隆过滤器由一个位数组和多个哈希函数组成。每个元素通过多个哈希函数映射到位数组的多个位置&#xff0c;并将这些位置上的值设为1。查询时&#xff0c;如果所有哈希函数对应的位置都为1&#xff0c;则认为该元素“可能存在于”集合中&…