面试经典150题 -- 回溯 (总结)

news2024/12/27 17:45:39

总的链接 : 

面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

17 . 电话号码的字母组合

1 . 先创建一个下标 与 对应字符串映射的数组,这里使用hash表进行映射也是可以的 ;

2 . 对于回溯 , 如果到了叶子节点 , 那么就直接添加即可 , 对于每一个path[i],都是存放digits[i]中数字字符对应字符串中的一个字符 , 遍历该字符串 , 对每一个字符进行递归操作 ;

3 . 对于不用恢复现场 : 因为每次递归到 i,一定会修改 path【i】,那么递归到终点时,每个 path【i】 都被覆盖成要枚举的字母,所以不需要恢复现场。

class Solution {
    string MAPPING[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
public:
    vector<string> letterCombinations(string digits) {
        int n = digits.length();
        if (n == 0) return {};
        vector<string> ans;
        string path(n, 0); // 本题 path 长度固定为 n
        function<void(int)> dfs = [&](int i) {
            if (i == n) {
                ans.emplace_back(path);
                return;
            }
            for (char c : MAPPING[digits[i] - '0']) {
                path[i] = c; // 直接覆盖
                dfs(i + 1);
            }
        };
        dfs(0);
        return ans;
    }
};

77 . 组合

. - 力扣(LeetCode)

枚举下一个选那个!

void dfs(int n , int k , int idx) ;

idx确定选取元素不重复 ;

如果当前集合中元素个数==k , 那么加入到ans中 ;

枚举下 一 个数选谁 ,从idx开使 , 遍历到n ; 

class Solution {
public:
    vector<vector<int>> ans;//存放符合条件结果的集合
    vector<int> path;//用来存放符合条件的结果

    void dfs(int n,int k,int startIndex){
        if(path.size()==k){
            ans.push_back(path);
            return;
        }
        for(int i=startIndex;i<=n-(k-path.size())+1;i++){
            path.push_back(i);//处理节点
            dfs(n,k,i+1);//递归
            path.pop_back();//回溯,撤销处理的节点
        }
    }

    vector<vector<int>> combine(int n, int k) {
        dfs(n,k,1);
        return ans;
    }
};

枚举这个数选或不选 : 

class Solution {
public:
    vector<vector<int>> ans  ;
    vector<int> path ;

    void dfs(int n , int k , int idx){
        int sz = path.size() ;
        if(sz == k){
            ans.push_back(path) ;
            return  ; // 回溯
        }

        if(k-sz>n-idx+1) return ;

        // 不选 
        dfs(n,k,idx+1) ;

        // 选
        path.push_back(idx) ;
        dfs(n,k,idx+1) ;
        path.pop_back() ;
    }

    vector<vector<int>> combine(int n, int k) {
        dfs(n , k , 1);
        return ans ;
    }
};

46 . 全排列

设置一个used数组 , 来表示当前数用没用过 , 没用过才能遍历 ;

每次都需要从 0 到 nums.size() 访问 ;

class Solution {
public:
    vector<vector<int>> ans;
    vector<int> path;
    void backtrack(vector<int>nums,vector<bool> used){
        if(path.size() >= nums.size()){
            ans.push_back(path);
            return;
        }
        for(int i=0;i<nums.size();i++){
            if(used[i]==true) continue;
            used[i] = true;
            path.push_back(nums[i]);
            backtrack(nums,used);
            used[i] = false;
            path.pop_back();
        }
    }
    vector<vector<int>> permute(vector<int>& nums) {
        ans.clear();
        path.clear();
        vector<bool> used(nums.size(),false);
        backtrack(nums,used);
        return ans;
    }
};

39  . 组合总和

按照target能不能够减到0来进行暴力寻找 : 

class Solution {
public:
    vector<vector<int>> ans  ;
    vector<int> path ;
    int n ;

    void dfs(vector<int>& c, int target , int idx){
        if(target == 0){
            ans.push_back(path) ;
            return ;
        }

        if(target < 0){
            return ;
        }

        // 枚举下一个选哪个
        for(int i=idx;i<n;i++){
            path.push_back(c[i]);
            dfs(c,target-c[i],i);// 能重复选取
            path.pop_back() ;// 撤销
        }
    }

    vector<vector<int>> combinationSum(vector<int>& c, int target) {
        n = c.size() ;
        sort(c.begin(),c.end()) ;
        dfs(c , target , 0);
        return ans ;
    }
};

52 . N皇后 ||

直接用一个 col 数组 ,来存每一行存那一列的存皇后的位置 ;

然后在回溯的时候,将与前面不冲突的数加入集合 ;

 22 . 括号生成

. - 力扣(LeetCode)

枚举填左括号还是右括号

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        int m = n * 2;
        vector<string> ans;
        string path(m, 0);
        function<void(int, int)> dfs = [&](int i, int open) {
            if (i == m) {
                ans.emplace_back(path);
                return;
            }
            if (open < n) { // 可以填左括号
                path[i] = '(';
                dfs(i + 1, open + 1);
            }
            if (i - open < open) { // 可以填右括号
                path[i] = ')';
                dfs(i + 1, open);
            }
        };
        dfs(0, 0);
        return ans;
    }
};

79 . 单词搜索

. - 力扣(LeetCode)

对每一个起点进行dfs搜索 , 判断是否满足 ;

class Solution {
public:
    bool exist(vector<vector<char>>& board, string word) {
        int n = board.size();
        int m = board[0].size();
        int dx[4] = {1,0,-1,0};
        int dy[4] = {0,1,0,-1};
        bool st[n][m];

        function<bool(int,int,int)> dfs = [&](int x,int y,int k)->bool{
            if(k==word.size()) return true;
            bool flag = false;
            st[x][y] = true;
            for(int i=0;i<4;i++){
                int tx = x+dx[i];
                int ty = y+dy[i];
                if(tx>=0 && tx<n && ty>=0 && ty<m && board[tx][ty] == word[k] && !st[tx][ty]) {
                    //cout<<tx<<" "<<ty<<" "<<k<<endl;
                    if(dfs(tx,ty,k+1)){
                        flag = true;
                        break;
                    } 
                }
            }
             st[x][y] = false;
            return flag;
        };
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++) {
                if(board[i][j] == word[0]){
                    memset(st,0,sizeof st);
                    if(dfs(i,j,1)){
                       return true;
                    } 
                } 
            }
        return false;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1489181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【DUSt3R】2张图2秒钟3D重建

【DUSt3R】2张图2秒钟3D重建 1. DUSt3R是一种用于稠密和无约束立体三维重建的方法,其实现步骤如下:2. 实际运行效果3. 运行结果4. 自问自答4.1 为社么这里要是使用transform模型呢?4.2 CroCo(通过跨视图完成3D视觉任务的自我监督预训练的一个研究)在DUSt3R的作用是什么,为…

蓝桥杯集训·每日一题2024 (差分)

前言&#xff1a; 差分笔记以前就做了&#xff0c;在这我就不再写一遍了&#xff0c;直接上例题。 例题&#xff1a; #include<bits/stdc.h> using namespace std; int a[10009],b[100009]; int main(){int n,ans10,ans20;cin>>n;for(int i1;i<n;i){cin>>…

凸优化和非凸优化

在数学中一个非凸的最优化问题是什么意思&#xff1f; 1、凸优化和非凸优化的定义 2、凸优化&#xff1a;相对简单 在凸集中&#xff0c;有个基本理论&#xff0c;那就是任意局部最优解一定是全局最优解。基于这个性质&#xff0c;设计一个简单的局部算法&#xff0c;比如 贪…

MySQL 的备份方式

MySQL 的备份方式 1. 逻辑备份 逻辑备份是指将数据库中的数据导出为可读的 SQL 语句&#xff0c;通过这些语句可以还原数据库的结构和数据。 使用 mysqldump 工具进行逻辑备份 - **命令示例&#xff1a;**mysqldump -u [username] -p [database_name] > backup_file.sql- …

企微hook源码第二弹

免费的企微框架&#xff0c;可下载测试。 支持文本消息&#xff0c;图片消息&#xff0c;视频消息&#xff0c;文件消息。 有兴趣可以进群交流。649480745&#xff0c;群内不定期开源企微hook源码 接下来就是第二弹的企微hook源码。后续会在群内开源完整源码。

【比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据】操作批量新增、分页查询(三)

orm框架使用性能比较 比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据 环境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本mybatis☑️☑️3.5.4sqltoy☑️☑️5.2.98lazy✖️☑️1.2.4…

CodeFlying 和 aixcoder两大免费软开平台,孰强孰弱?

今天为大家带来码上飞CodeFlying和aixcoder两款免费的软件开发平台效果的测评 一、产品介绍 首先简单介绍一下这两个平台 码上飞CodeFlying&#xff1a;码上飞 CodeFlying | AI 智能软件开发平台&#xff01; 是一款革命性的软件开发平台&#xff0c;它通过将软件工程和大模…

分库分表如何管理不同实例中几万张分片表?

在进行分库分表设计时&#xff0c;确认好了数据节点数量和分片策略以后&#xff0c;接下来要做的就是管理大量的分片表。实际实施过程中可能存在上百个分片数据库实例&#xff0c;每个实例中都可能有成千上万个分片表&#xff0c;如果仅依靠人力来完成这些任务显然是不现实的。…

spring自定义事件监听器

1. 创建自定义事件 import org.springframework.context.ApplicationEvent; import java.util.List;public class CollectionCreateEvent extends ApplicationEvent {private List<String> fileList;public CollectionCreateEvent(Object source,List<String> file…

【CSP试题回顾】201312-2-ISBN号码

CSP-201312-2-ISBN号码 解题思路 输入ISBN码&#xff1a;从用户接收一个ISBN字符串。 初始化变量&#xff1a;创建一个向量verifyArray来存储ISBN的前9位数字&#xff0c;和两个整数identificationCode和checkSum分别用于存储ISBN的校验位和计算出的校验和。 处理ISBN字符串…

道路积水监测站——确保道路畅通和行车安全

TH-JS1道路积水监测站是一种专门用于监测城市道路积水情况的设备&#xff0c;旨在保障城市道路安全和防止水患对交通造成的不利影响。这些监测站通过实时检测和记录道路积水数据&#xff0c;为城市管理部门提供重要信息&#xff0c;以便及时采取应对措施&#xff0c;确保道路畅…

【CSP试题回顾】201409-2-画图

CSP-201409-2-画图 解题思路 定义picture的二维数组&#xff0c;用于记录每个单元是否被涂色。数组的大小被设置为105x105&#xff0c;这是为了确保能够覆盖题目中可能出现的所有坐标。 输入变量n&#xff0c;表示将要绘制的矩形数量。 对于每个矩形&#xff0c;读取其左下角…

Ruoyi框架上传文件

axios资料&#xff1a;axios中文文档|axios中文网 | axios axiosjson 默认情况下&#xff0c;axios将JavaScript对象序列化为JSON。 submit(data) {if (data && this.definitionId) {// 启动流程并将表单数据加入流程变量startProcess(this.definitionId, JSON.string…

MySQL--优化(SQL语句执行慢,如何分析)

MySQL–优化&#xff08;SQL语句执行慢&#xff0c;如何分析&#xff09; 定位慢查询SQL执行计划索引 存储引擎索引底层数据结构聚簇和非聚簇索引索引创建原则索引失效场景 SQL优化经验 一、如何分析 聚合查询&#xff1a; 对于涉及大量数据的聚合操作&#xff0c;如果可能的…

【GIS技术】GIS在地质灾害易损性评价、危险性评估与灾后重建中的实践技术应用

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…

python并发 map函数的妙用

1.map是什么&#xff1f; map函数是Python中的一个内置函数&#xff0c;用于将一个函数应用到一个或多个可迭代对象的每个元素上&#xff0c;生成一个新的可迭代对象。它的一般形式是&#xff1a; map(function, iterable1, iterable2, ...)其中&#xff0c;function是一个函…

linux安装mysql5.7

linux安装mysql5.7 一、下载mysql5.7二、解压包介绍三、上传包到linux四、卸载mariadb五、安装mysql六、修改权限七、启动mysql八、使用过navicat创作不易&#xff0c;笔记不易&#xff0c;如觉不错&#xff0c;请三连&#xff0c;谢谢~~ 一、下载mysql5.7 去mysql官方下载&am…

Python解释器及PyCharm安装教程

PyCharm官方下载地址☞https://www.jetbrains.com/pycharm/download/?sectionwindows Python解释器官方下载地址☞ https://www.python.org/downloads/windows/

pytorch续写tensorboard

模型训练到一半有 bug 停了&#xff0c;可以 resume 继续炼&#xff0c;本篇给出 pytorch 在 resume 训练时续写 tensorboard 的简例&#xff0c;参考 [1-3]&#xff0c;只要保证 writer 接收的 global step 是连着的就行。 Code import numpy as np from torch.utils.tensor…

UE5 UE4 关闭/开启引擎开启插件(UE4 MDL资源删除)

问题&#xff1a; 最近遇到了个情况&#xff0c;我安装在UE4.26中的一个NVIDA Omniverse插件&#xff0c;这个插件导致每次生成新的项目时&#xff0c;都会自动开启并在工程中生成一个MDL的文件夹和资源&#xff0c;比较烦。 而且是空工程&#xff0c;也依然自动生成。删除、…