穷举深搜暴搜回溯剪枝(2)

news2024/12/25 0:04:45

一)电话号码的字母组合

17. 电话号码的字母组合 - 力扣(LeetCode)

1)画出决策树:只是需要对最终的决策树做一个深度优先遍历

把图画出来,知道每一层在干什么,代码就能写出来了

 

 2)定义全局变量:

1)定义一个哈希表来处理数字和字符串的映射关系

2)使用ret来保存最终结果

class Solution {
    HashMap<Character,String> result=new HashMap<>();
    List<String> ret;
    StringBuilder path;
    public List<String> letterCombinations(String digits) {
        this.path=new StringBuilder();
        result.put('2',"abc");
        result.put('3', "def");
        result.put('4', "ghi");
        result.put('5', "jkl");
        result.put('6', "mno");
        result.put('7', "pqrs");
        result.put('8', "tuv");
        result.put('9', "wxyz");
        this.ret=new ArrayList<>();
        if(digits.length()==0){
            return ret;
        }
    dfs(result,digits,0);
    return ret;
    }
public void dfs(HashMap<Character,String> result,String digits,int index){
        if(index==digits.length()){
//这个最终条件,第一次就写错了,index遍历到数组的最后一个位置
            ret.add(path.toString());
            return;
        }
       Character number=digits.charAt(index);
       String string=result.get(number);
       char[] chars=string.toCharArray();
       for(int i=0;i<chars.length;i++){
           path.append(chars[i]);
//继续遍历到下一层
           dfs(result,digits,index+1);
//恢复现场,回退到上一层
           path.deleteCharAt(path.length()-1);
       }
    }
}

二)括号生成:

22. 括号生成 - 力扣(LeetCode)

先进行想一下,什么是有效的括号组合?

1)左括号的数量==有括号的数量

2)从头开始的任意一个子串中,左括号的数量都是大于等于右括号的数量,如果发现右括号的数量是大于左括号的,那么必然会出现一个右括号没有做括号匹配,所以就不是一个有效的括号组合

假设如果n==3,那么我们只是需要枚举6个位置即可,因为n==3表示的是三对括号,一共有6个位置,那么我们只是需要进行暴力枚举6个位置可能出现的情况就可以了

一)画出决策树:

 二)定义一个全局变量: 

1)left表示左括号的数量,right表示右括号的数量,N表示一共有多少对括号

2)当进行深度优先遍历的时候,使用这个path变量来进行记录这个路径中曾经出现过的括号

三)dfs所干的事:

当左括号合法的时候,把左括号添加到path中当右括号合法的时候,把右括号添加到path中

四)递归:遇到叶子节点的时候,将这个path添加到ret中,遇到叶子节点的情况就是当right==N的时候,说明此时右括号已经满了

class Solution {
    int N;
    StringBuilder path;
    List<String> ret;
    int right=0;
    int left=0;
    public List<String> generateParenthesis(int n) {
        N=n;
        path=new StringBuilder();
        ret=new ArrayList<>();
        dfs();
        return ret;
    }
    public void dfs(){
         if(right==N){
             ret.add(path.toString());
             return;
         }
    //选择左括号
    if(left<N){
         path.append('(');
         left++;
         dfs();
         //回溯恢复现场
         left--;
         path.deleteCharAt(path.length()-1);
      }
    if(right<left){
        path.append(')');
        right++;
        dfs();
        //回溯恢复现场
        right--;
        path.deleteCharAt(path.length()-1);
    }
    }
}

其实本质上来说把刚才的那些全局变量放到参数里面,只是回溯时候的操作是不一样的

三)组合:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

1)实现剪枝的操作:当我们进行枚举当前数的时候,只需要从当前数的下一个数字开始进行枚举就可以了,只需要控制dfs的参数即可

2)dfs做的事:从pos位置开始进行枚举,将枚举的情况添加到path中即可

3)回溯:当枚举完成当前位置向上归的过程中,先把path中添加的数进行剔除,然后再返回到上一层即可

4)递归出口:k==path.size()

 

class Solution {
    List<List<Integer>> ret;
    List<Integer> path;
    int N;
    int k;
    public List<List<Integer>> combine(int n, int k) {
        N=n;
        this.k=k;
        path=new ArrayList<>();
        ret=new ArrayList<>();
        dfs(1);
       return ret;
    }
    public void dfs(int index){
         if(path.size()==k) {
            ret.add(new ArrayList<>(path));
            return;
        }
    for(int i=index;i<=N;i++){
        path.add(i);
        dfs(i+1);
        path.remove(path.size()-1);
    }
    }
}

四)目标和

494. 目标和 - 力扣(LeetCode)

1)

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

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

相关文章

【freespace】YOLOP: You Only Look Once for Panoptic Driving Perception论文解读

目录 Abstract 摘要 1、简介 2、 相关工作 2.1. 交通目标检测 2.2. 可驾驶区域分割 2.3. 车道检测 2.4. 多任务的方法 3. 方法 3.1. 编码器 3.1.1 骨干 3.1.2 脖子 3.2. 解码器 3.2.1 探测头 3.2.2 可驾驶区域分段头&车道线分段头 3.3. 损失函数 3.4. 训练模…

Windows同时安装两个版本的JDK并随时切换,以JDK6和JDK8为例,并解决相关存在的问题(亲测有效)

Windows同时安装两个版本的JDK并随时切换&#xff0c;以JDK6和JDK8为例&#xff0c;并解决相关存在的问题&#xff08;亲测有效&#xff09; 1.下载不同版本JDK 这里给出JDK6和JDK的百度网盘地址&#xff0c;具体安装过程&#xff0c;傻瓜式安装即可。 链接&#xff1a;http…

华为OD机试真题 JavaScript 实现【机器人活动区域】【2023Q1 200分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、JavaScript算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试&am…

EXCEL,多条件查询数字/文本内容的4种方法

目录 1 问题&#xff1a;如何根据多条件查询到想要的内容 2 方法总结 2.1 方法1&#xff1a; sumif() 和sumifs() 适合查找符合条件的多个数值之和 2.2 方法2&#xff1a;使用lookup(1,0/((区域1条件1)*(区域2条件2)*....),结果查询区域) 2.3 方法3&#xff1a;使用 ind…

rknn模型在rv1126开发板上跑

在前面&#xff0c;已经将 onnx模型转为 rknn模型。 yolov5 onnx模型 转为 rknn模型_爱钓鱼的歪猴的博客-CSDN博客 这里探讨的是&#xff1a;rknn模型在rv1126开发板上运行 目录 1、rknn模型在PC端进行推理测试&#xff0c;评估模型精度 2、模型预编译 3、rknn模型部署到r…

【LeetCode】根据二叉树创建字符串

根据二叉树创建字符串 题目描述算法分析编程代码 链接: 根据二叉树创建字符串 题目描述 算法分析 当单纯的按照前序遍历输出后&#xff0c;我们只要对&#xff08;&#xff09;进行一些修改就好 编程代码 /*** Definition for a binary tree node.* struct TreeNode {* …

偷懒神器-->花样的代码生成工具

1、CRUD代码生成&#xff1a; 根据MyBatisPlus逆向工程改造而来&#xff0c;添加了showDoc文档生成&#xff0c;数据库脚本生成&#xff0c;增删改查文件生成&#xff0c;Po、Vo、Request对象生成等。普通的增删改查一般搞定。并预调了部份判断逻辑。 效果示例&#xff1a; p…

0801|IO进程线程day4 文件IO函数-目录相关函数

1&#xff09;opendir 功能&#xff1a;打开一个目录文件; 原型&#xff1a; #include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name); 参数&#xff1a; char *name&#xff1a;指定要打开的目录的路径以及名字; 返回值&#xff1a; 成功&…

OpenCV实战:从图像处理到深度学习的全面指南

文章目录 1. OpenCV简介什么是OpenCV&#xff1f;OpenCV的历史与发展OpenCV的应用领域 2. OpenCV的安装与配置OpenCV在Windows系统下的安装OpenCV在Linux系统下的安装OpenCV在Mac OS系统下的安装配置Python环境使用OpenCV 3. OpenCV基础图像的载入、显示和保存图像的基础操作图…

java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis em

&#xfeff; 工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据…

linux(一)-----osi七层模型

1.七层模型的定义 1&#xff09;物理层 &#xff08;指的是网卡&#xff0c;网线等物理层面的硬件&#xff09; 2&#xff09;数据链路层 前两层可以概括为物理链路层&#xff0c;以二进制的数据形式在物理媒介上进行传输数据&#xff08;传输协议ISO2100协议&#xff09; …

微信小程序 - 解析富文本插件版们

一、html2wxml 插件版 https://gitee.com/qwqoffice/html2wxml 申请使用注意事项 插件版本解析服务是由 QwqOffice 完成&#xff0c;存在不稳定因素&#xff0c;如对稳定性有很高的要求&#xff0c;请自行搭建解析服务&#xff0c;或在自家服务器上直接完成解析。对于有关插…

SCI论文的发文的模板(Elsevier,MDPI,IEEE)

不同的SCI期刊都有自己的出版商&#xff0c;不同的出版商有不同的发文格式。 最简单的方式就是去查官网上面&#xff0c;常用的期刊格式如下。到对应的位置下载模板即可&#xff0c;推荐使用latex。 MDPI MDPI | Preparing Manuscripts in LaTeX Elsevier Guide for authors …

P3373 【模板】线段树 2(乘法与加法)(内附封面)

【模板】线段树 2 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面三种操作&#xff1a; 将某区间每一个数乘上 x x x&#xff1b;将某区间每一个数加上 x x x&#xff1b;求出某区间每一个数的和。 输入格式 第一行包含三个整数 n , q , m n,q,m n,…

【多线程初阶】多线程案例之单例模式

文章目录 前言1. 什么是单例模式2. 饿汉模式3. 懒汉模式 --- 单线程版4. 懒汉模式 --- 多线程版5. 懒汉模式 --- 多线程改进版总结 前言 本文主要给大家讲解多线程的一个重要案例 — 单例模式. 关注收藏, 开始学习吧&#x1f9d0; 1. 什么是单例模式 单例模式是一种很经典的…

数据结构-二叉树

数据结构-二叉树 二叉树的概念二叉树的遍历分类 建立二叉树&#xff0c;并遍历二叉树的最小单元二叉树的最小单元初始化初始化二叉树前序遍历的实现中序遍历的实现后序遍历的实现计算节点的个数计算树的深度求第k层的个数查找二叉树的元素分层遍历 全部代码如下 二叉树的概念 二…

MySQL数据库服务器安装与配置(步骤简单详细,看完可学会下载MySQL所有版本)

目录 引言 一&#xff0c;5.6.51数据库服务器下载 二&#xff0c;8.1.0最新版数据库服务器下载 三&#xff0c;MySQL客户端下载 引言 个人认为MySQl数据库目前推荐的两个版本系列为5.6.51和8.系列。 至于我们为什么要下载两个版本呢&#xff1f;是因为官方在数据库下载的结构…

C++:STL的引入和string类

文章目录 STLSTL是什么STL的六大组件 stringstring类内成员函数迭代器 STL STL是什么 什么是STL&#xff1f;STL是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个包罗数据结构与算法的软件框架。 STL的六大组件 要学一个新知识&#xf…

微信小程序 - scroll-view组件之上拉加载下拉刷新(解决上拉加载不触发)

前言 最近在做微信小程序项目中&#xff0c;有一个功能就是做一个商品列表分页限流然后实现上拉加载下拉刷新功能&#xff0c;遇到了一个使用scroll-viwe组件下拉刷新事件始终不触发问题&#xff0c;网上很多说给scroll-view设置一个高度啥的就可以解决&#xff0c;有些人设置了…

嵌入式软件开发有没有捷径

嵌入式软件开发有没有什么捷径&#xff1f;不定期会收到类似的问题&#xff0c;我只想说&#xff1a;嵌入式软件开发没有捷径 说实话&#xff0c;有这种想法的人&#xff0c;我其实想劝你放弃。对于绝大多数普通人&#xff0c;一步一个脚印就是捷径。 当然&#xff0c;这个问题…