hot100 -- 回溯(上)

news2024/11/20 10:24:25

目录

🍞科普

🌼全排列

AC  DFS

🚩子集

AC  DFS

🎂电话号码的字母组合

AC  DFS

🌼组合总和

AC  DFS


🍞科普

忘记 dfs 的,先看看这个👇

DFS(深度优先搜索)8种题型_dfs典型问题-CSDN博客

🌼全排列

46. 全排列 - 力扣(LeetCode)

AC  DFS

排列型枚举哦~

vector 中 push_back 和 [] 下标访问是不一样的

push_back() 是往末尾加入元素,vector 大小会自动增加

而 [] 是直接改变 vector 某个位置的元素

如果你先 ret[i] = count[i]; 然后 ret.pop_back(); 多次循环后,vector 为空,此时再访问就会报错空指针 Null Pointer 错误

时间 O(n * !n),空间 O(n)

class Solution {
private:

    vector<vector<int>> ans;
    vector<int> ret; // 临时答案
    bool vis[7]; // 标记数组--需要回溯

    void dfs(vector<int>& nums, int count) {
        int n = nums.size();

        // 递归出口
        if (count == n) {
            ans.push_back(ret);
            return;
        }
        
        // 遍历每个位置
        for (int i = 0; i < n; ++i) {
            if (vis[i] == 0) {
                ret.push_back(nums[i]); // 加入答案数组
                vis[i] = 1; // 标记
                dfs(nums, count + 1); // 递归

                vis[i] = 0; // 取消标记
                ret.pop_back(); // 取消标记
            }
        }
    }

public:

    vector<vector<int>> permute(vector<int>& nums) {\
        dfs(nums, 0);
        return ans;
    }

};

🚩子集

78. 子集 - 力扣(LeetCode)

指数型枚举哦~

AC  DFS

只有 选 / 不选 两种

时间 O(n * 2^n),空间 O(n)

class Solution {
private:
    vector<vector<int>> ans;
    vector<int> ret; // 临时答案
public:
    void dfs(vector<int>& nums, int count) {
        int n = nums.size();
        // 递归出口
        if (count == n) {
            ans.push_back(ret);
            return;
        }
        // 选 OR 不选

        // 选
        ret.push_back(nums[count]); // 类似标记
        dfs(nums, count + 1); // 递归
        ret.pop_back(); // 类似取消标记

        // 不选
        dfs(nums, count + 1);
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        dfs(nums, 0);
        return ans;
    }
};

🎂电话号码的字母组合

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

AC  DFS

空数组是 {},而不是 [],编译器看不懂这种 lambda 表达式

本题不要标记,因为,比如 "222",是可以取 "aaa" 的 

3 个字母的数字输入 m 个,4 个字母的输入 n 个

时间 O(3^m * 4^n) -- 遍历每一种字母组合

/*
1)  n 个数字, 每个数字取 1 个字母, 共取出 n 个字母
2) 取出的 n 个字母,按顺序组合起来 -- O(1)
*/
class Solution {
private:

    string ret; // 临时答案
    vector<string> ans;
    string num_alpha[10] = {"", "", "abc", "def", "ghi", "jkl", 
                                   "mno", "pqrs", "tuv", "wxyz"};
    
    // 已选 count 个数字
    void dfs(string digits, int count) {
        int n = digits.size();
        if (count == n) {
            ans.push_back(ret);
            return;
        }
        int num = digits[count] - '0'; // 当前数字
        string now = num_alpha[num]; // 当前字符串
        // 取一个字母
        for (int i = 0; i < now.size(); ++i) {
            ret.push_back(now[i]); // 插入字母

            dfs(digits, count + 1); // 递归

            ret.pop_back(); // 回溯时,便于填充其他字母
        }
    }

public:
    vector<string> letterCombinations(string digits) {
        // 特判空字符串, 返回空数组, 而不是包含空字符串的数组 [""]
        if (digits == "")
            return {};
        dfs(digits, 0);
        return ans;
    }
};

🌼组合总和

39. 组合总和 - 力扣(LeetCode)

AC  DFS

1)指数型枚举的前提下,一个数字可以 “无限制重复” 被选取

2)还要考虑到,这题是 组合 问题,相同组合不同排列,视为同一种结果

3)分两种情况讨论,选 / 不选,注意参数的不同

class Solution {
private:
    vector<vector<int>> ans;
    vector<int> ret; // 临时答案

    // num - candidates[i], num == 0 得到一个结果
    // 剩余 num, 第 start 个数字
    void dfs(vector<int>& candidates, int num, int start) {
        int n = candidates.size();
        // 递归出口
        if (start >= n) return;

        // 一种结果
        if (num == 0) {
            ans.push_back(ret);
            return;
        }

        // 选(当前数字)

        // 不超过 target
        if (num - candidates[start] >= 0) {
            ret.push_back(candidates[start]);
            dfs(candidates, num - candidates[start], start); // 选当前数字
            ret.pop_back(); // 恢复现场
        }

        // 不选(当前数字)
        dfs(candidates, num, start + 1); // 递归下一个
    }
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
    dfs(candidates, target, 0); // 剩余 target, 第 0 个数字开始
    return ans;
    }
};

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

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

相关文章

使用 Flask 和 Celery 构建异步任务处理应用

文章目录 什么是 Flask&#xff1f;什么是 Celery&#xff1f;如何在 Flask 中使用 Celery&#xff1f;步骤 1&#xff1a;安装 Flask 和 Celery步骤 2&#xff1a;创建 Flask 应用程序步骤 3&#xff1a;运行 Celery Worker步骤 4&#xff1a;启动 Flask 应用程序 结论 在构建…

SQLiteOpenHelper数据库帮助器

SQLiteOpenHelper数据库帮助器是Android提供的数据库辅助工具。 1、继承SQLiteOpenHelper类&#xff0c;需要重写onCreate和onUpgrade两个方法 案例&#xff1a;实现增删改查 package com.example.databases_text;import android.app.PictureInPictureParams; import androi…

maven打包报错:MalformedInputException: Input length = 1

maven 打包时报错&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources (default-resources) on project ec-work-mes: filtering /Users/ecmaster/svn/ecmaster/ynmk/ynmk-mes/ec-work/ec-work-mes/src/main/resou…

【问题处理】maven一直提示artemis-http-client-1.1.8.jar报错(2024-05-25)

项目使用了视频监控&#xff0c;里面涉及到海康威视的视频监控。 问题&#xff1a; pom在导入maven时&#xff0c;报错“Could not find artifact com.artemis:http-client:jar:1.1.8 ” 原因&#xff1a; 根据平台提供的maven地址&#xff0c;填写进pom文件中&#xff0c;编…

从0开始linux(3)——如何读写文件

欢迎来到博主的专栏——从0开始linux 博主ID&#xff1a;代码小豪 文章目录 创建普通文件用文本编辑器nano写入文件如何读取文件cat命令less命令head和tail 我们前面已经了解和如何操作文件&#xff0c;但是目前认识的文件类型分为两类&#xff0c;一类是目录文件、另一类是普通…

PDF 生成在左侧目录栏目录信息的目录 点击跳转

pdf 导出的内容 是itextpdf 写的 目录信息 得用 pdfbox 里的 PDDocumentOutline <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.4.3</version></dependency><dependency&g…

[手游] 正义对决3

《正义对决3联机版》是一款多人联机的竞技射击游戏&#xff0c;玩家将扮演警方和强盗两个不同的势力&#xff0c;展开一场在庞大都市中的正义之战。强盗一方将在城市内抢劫各处并藏匿&#xff0c;而警方则必须将所有罪犯绳之以法。游戏中&#xff0c;玩家可自由购买众多武器装备…

OpenCASCADE Draw模块TKDraw项目问题修改

1.问题 在调试Draw模块代码时&#xff0c;出现一个小问题&#xff0c;导致无法正常运行 如下&#xff1a; 2.代码跟踪 通过代码跟踪发现时一个数组越界问题&#xff0c;在此处添加了判断处理&#xff0c;程序可以正常调试

批量复制文件智能删除已复制,轻松管理文件新体验!让您的文件整理更高效无忧

在信息爆炸的时代&#xff0c;文件管理无疑成为我们日常生活和工作中不可或缺的一部分。面对堆积如山的文件&#xff0c;我们时常陷入无尽的复制、粘贴、删除循环中&#xff0c;不仅耗时耗力&#xff0c;还容易出错。但今天&#xff0c;我要向您推荐一款颠覆传统的文件管理工具…

手撕算法|斯坦福大学教授用60页PPT搞定了八大神经网络

人工智能领域深度学习的八大神经网络常见的是以下几种 1.卷积神经网络&#xff08;CNN&#xff09;&#xff1a; 卷积神经网络是用于图像和空间数据处理的神经网络&#xff0c;通过卷积层和池化层来捕捉图像的局部特征&#xff0c;广泛应用于图像分类、物体检测等领域。 2.循…

Convolutional Occupancy Networks【ECCV】

论文&#xff1a;https://arxiv.org/pdf/2003.04618 代码&#xff1a;GitHub - autonomousvision/convolutional_occupancy_networks: [ECCV20] Convolutional Occupancy Networks 图 1&#xff1a;卷积占据网络。传统的隐式模型 (a) 由于其全连接网络结构&#xff0c;表现能力…

真拿AI赚到钱的人,不在朋友圈里

1 最近有张两大AI巨头对比的梗图给我看乐了&#xff0c;玩儿AI的还在做产品&#xff0c;玩儿焦虑的已经在数钱了。 这也是在做AI&#xff0c;只不过是唉声叹气的ai。 要我说&#xff0c;现在缺的根本不是AI&#xff0c;而是【有用的AI】。 恩格斯老师说过一句话&#xff1a…

基于Python图像增强算法:低光增强+图像修复+超分辨率重建

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在图像处理与计算机视觉领域&#xff0c;图像增强技术是提高图像质量和可用性的重要手段。在实…

揭秘!亚马逊、Vinted卖家如何借助自养号测评实现爆单?

​作为一名跨境卖家&#xff0c;你一定梦想着能够在亚马逊上实现爆单&#xff0c;让产品火爆销售。下面就分享五个秘诀&#xff0c;帮助你实现这个梦想&#xff1a; 1. 优质产品&#xff1a;首先&#xff0c;确保你的产品质量优秀&#xff0c;能够满足消费者的需求。品质好的产…

数据结构和算法基础(一)

数据结构——基本概念 数据&#xff1a;数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 数据元素、数据项&#xff1a;数据元素是数据的基本单位&#xff0c;通常作为…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第三周) - 词嵌入

词嵌入 1. 词嵌入2. Word2Vec3. 其他词嵌入方法 3.1. GloVe3.2. FastText3.3. 动态词向量 4. 词嵌入中的偏见5. 词嵌入的应用 5.1. 深度平均网络 1. 词嵌入 词嵌入(Word Embeddings)是一种将单词映射到连续向量空间中的技术&#xff0c;用于表示单词的语义信息。相比于传统的…

免费、开源、好用的 SQL 客户端合集

免费、开源、好用的 SQL 客户端合集 分类 编程技术 0、SQL Chat SQL Chat 是 2023 年 3 月推出的新型 SQL 客户端&#xff0c;它将数据库管理带入了基于聊天的新时代。 SQL Chat 由 ChatGPT 驱动&#xff0c;能够帮你编写和润色 SQL 语句&#xff0c;让数据库操作变得更加智…

华为数通 HCIP-Datacom(H12-821)题库

最新 HCIP-Datacom&#xff08;H12-821&#xff09;完整题库请扫描上方二维码访问&#xff0c;持续更新中。 BGP路由的Update消息中可不包含以下哪些属性&#xff1f; A、Local Preference B、AS Path C、MED D、Origin 答案&#xff1a;AC 解析&#xff1a;as-path和ori…

缩进在编程中的重要性及正确使用方法

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 前言 缩进不当引发的问题 缩进的正确使用方法 缩进错误的调试与修复 总结 前言 在编程世…

vue2快速安装环境,从0-1创建vue2项目教程

vue2快速安装环境&#xff0c;从0-1创建vue2项目教程(windows) 一、node下载 1.如何查看node版本和npm版本 二、npm安装脚手架 1.注意事项 三、vue2选项解读 四、运行脚手架 一、node下载 1、(node.js中文网) 下载长期稳定版本就行 解释下node.js和npm的关系? 想象你在…