hot100 -- 回溯(上)

目录

🍞科普

🌼全排列

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;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ping 探测网段哪些地址被用

#!/bin/bash# 遍历192.168.3.1到192.168.3.254 for i in {1..254} doip"192.168.3.$i"# 对每个IP地址进行三次ping操作if ping -c 3 -W 1 $ip > /dev/null 2>&1thenecho "$ip: yes"fi done$ sh test.sh 192.168.3.1: yes 192.168.3.95: yes 192.…

MySQL中的sql语句

MySQL中的sql语句 DML、 DDL、 DCL DML(Data Manipulation Language)&#xff0c;用于对数据库中的数据进行操作&#xff0c;包括插入、查询、更新和删除数据等操作。常见的 DML 命令包括 SELECT&#xff08;查询&#xff09;、INSERT&#xff08;插入&#xff09;、UPDATE&a…

Windows系统安装dlib及face_recognition搭建人脸识别环境

关于face_recognition face_recognition被称为世界上最简洁的人脸识别库&#xff0c;借助face_recognition库&#xff0c;我们可以使用Python和命令行提取、识别、操作人脸。 face_recognition的人脸识别是基于业内领先的C开源库 dlib中的深度学习模型&#xff0c;用Labeled …

数据结构——栈(详细分析)

目录 &#x1f349;引言 &#x1f349;栈的本质和特点 &#x1f348;栈的基本操作 &#x1f348;栈的特点 &#x1f34d;后进先出 &#x1f34d;操作受限 &#x1f34d;动态调整 &#x1f348;栈的优缺点 &#x1f34d;优点 &#x1f34d;缺点 &#x1f349;栈的应用…

STM32F407VET6 学习笔记4:DAC数模转换功能的配置

今日继续学习使用嘉立创的 立创梁山派天空星&#xff0c;芯片是 STM32F407VET6 使用库函数编程 最近突然发现很久没有接触过单片机的AD转换功能了&#xff0c;之前还是学习51单片机时学习驱动PCF8591芯片实现AD转换功能的&#xff0c;还从未在STM32平台上进行过相关的实验经验…

解决go install 网络问题

rootiZbp1hiqzlhh6w05gloffgZ:~# go install mvdan.cc/garblelatest go: mvdan.cc/garblelatest: module mvdan.cc/garble: Get "https://proxy.golang.org/mvdan.cc/garble/v/list": dial tcp 172.217.160.81:443: i/o timeout解决方法 更换阿里代理 rootiZbp1hiq…

保障餐饮场所安全:定期送检可燃气体报警器

在餐饮行业&#xff0c;火灾隐患一直备受关注。餐厅、茶饮店等场所常常使用燃气设备&#xff0c;而这些设备带来了潜在的安全隐患。 为了及时发现并预防可燃气体泄漏&#xff0c;可燃气体报警器的定期送检显得尤为重要。那么&#xff0c;为什么可燃气体报警器需要定期送检呢&a…

python中的线程并行

文章目录 1. 单线程2. 线程池ThreadPoolExecutor 1. 单线程 现在有1154张图片需要顺时针旋转后保存到本地&#xff0c;一般使用循环1154次处理&#xff0c;具体代码如下所示&#xff0c;img_paths中存储1154个图片路径&#xff0c;该代码段耗时约用97ms。 t1time.time() for …

【再探】设计模式—代理模式

代理是指授权代理人在一定范围内代表其向第三方进行处理有关事务。 1 代理模式 需求&#xff1a;1&#xff09;将业务代码与非业务代码分离&#xff0c;在不改变代码结构的基础上&#xff0c;为其添加新的功能。2&#xff09;为系统中的某些操作做同一处理&#xff0c;例如进…

Dilworth 定理

这是一个关于偏序集的定理&#xff0c;事实上它也可以扩展到图论&#xff0c;dp等中&#xff0c;是一个很有意思的东西 偏序集 偏序集是由集合 S S S以及其上的一个偏序关系 R R R定义的&#xff0c;记为 ( S , R ) (S,R) (S,R) 偏序关系&#xff1a; 对于一个二元关系 R ⊂…

Python筑基之旅-MySQL数据库(四)

目录 一、数据表操作 1、新增记录 1-1、用mysql-connector-python库 1-2、用PyMySQL库 1-3、用PeeWee库 1-4、用SQLAlchemy库 2、删除记录 2-1、用mysql-connector-python库 2-2、用PyMySQL库 2-3、用PeeWee库 2-4、用SQLAlchemy库 3、修改记录 3-1、用mysql-conn…

力扣HOT100 - 21. 合并两个有序链表

解题思路&#xff1a; class Solution {public ListNode mergeTwoLists(ListNode list1, ListNode list2) {ListNode dum new ListNode(0), cur dum;while (list1 ! null && list2 ! null) {if (list1.val < list2.val) {cur.next list1;list1 list1.next;} els…

力扣刷题---3146. 两个字符串的排列差

题目描述 给你两个字符串 s 和 t&#xff0c;每个字符串中的字符都不重复&#xff0c;且 t 是 s 的一个排列。 排列差 定义为 s 和 t 中每个字符在两个字符串中位置的绝对差值之和。 返回 s 和 t 之间的 排列差 。 示例 1&#xff1a; 输入&#xff1a;s “abc”, t “b…

四万字长文详解——node.js使用移动云,EOS对象存储

目录 前言 安装及安装前的操作 前置条件 如何创建认证信息 使用npm安装SDK开发包 安装开发包命令 初始化操作 存储桶 查看结果命令 查看桶列表 查看结果命令 删除桶 查看结果命令 创建桶 获取桶列表 判断桶是否存在 查询桶所属地域 查询桶的访问权限 管理桶的…

基于springboot+vue+Mysql的校园台球厅人员与设备管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

【C语言】冒泡排序详解

前言 排序&#xff0c;就是将一组数据按特定的规则调换位置&#xff0c;使这组数据具有某种顺序关系&#xff0c;一般就是递增或递减。 在接触C语言不久&#xff0c;我们就会遇到其中一种有名的排序算法——“冒泡排序”&#xff0c;不知道你是否已经掌握了&#xff0c;如果还…

2024最新 Jenkins + Docker 实战教程(五)- 配置Gitee Webhooks实现自动构建部署

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

等保建设:打造MySQL数据库审计系统

1、建设目标 在等级保护三级->应用安全->安全审计中强制需要有审计平台(满足对操作系统、数据库、网络设备的审计&#xff0c;在条件不允许的情况下&#xff0c;至少要使用数据库审计) 数据库审计服务符合等级保护三级标准&#xff0c;帮助您满足合规性要求&#xff0c;…

什么是组态?什么是工业控制中的组态软件?

随着工业4.0和智能制造的发展&#xff0c;工控软件的应用越来越广泛&#xff0c;它们在提高生产效率、降低能耗和减少人力成本等方面发挥着越来越重要的作用。 什么是工控软件&#xff1f; 工控软件是指用于工业控制系统的软件&#xff0c;主要应用于各种生产过程控制、自动化…

Java中流的概念细分

按流的方向分类&#xff1a; 输入流&#xff1a;数据流向是数据源到程序&#xff08;以InputStream、Reader结尾的流&#xff09;。 输出流&#xff1a;数据流向是程序到目的地&#xff08;以OutputStream、Writer结尾的流&#xff09;。 按处理的数据单元分类&#xff1a; 字…