leecode刷题经典算法套路模版笔记【递归回溯篇】--根本逻辑,快速掌控

news2024/9/23 5:23:08

刷题套路总结:

双指针:

单调性;对两端按照规律进行操作移动;
常见移法,右指针右移扩大范围,左指针左移缩小范围;
先举例模拟,然后推导公式;

递归,回溯 :

原问题,拆分为子问题
怎么往下递,怎么往上归
边界条件逻辑写对
模版:在这里插入图片描述

子集型回溯、组合型回溯、排列型回溯

0,1背包也可看成一种子集型回溯 (打家劫舍类似也可以)

子集型回溯,本质就是看对每一个元素,是选它,还是不选它,
在这里插入图片描述
两种解法:
在这里插入图片描述
第一种思路,选还是不选每一个元素

class Solution {    
public:
    vector<int>path;
    vector<vector<int>>res;
    void dfs(int i,int n, vector<int>& nums)
    {
        if(i==n)
        {
            res.push_back(path); // 这里表示只有到第n层,才算确定一种path答案
            return; 
        }
        // 不选 nums[i]
        dfs(i+1,n,nums);
        // 选 nums[i]
        path.push_back(nums[i]);
        dfs(i+1,n,nums);
        path.pop_back();

    }
    vector<vector<int>> subsets(vector<int>& nums) {
        int n=nums.size();
        dfs(0,n,nums);
        return res;

    }
};

在这里插入图片描述
第二种思路,每次进行枚举选一个严格递增的元素,这里由于子集的长度没有约束,所以每种长度都可以是答案。
在这里插入图片描述

class Solution {
public:
    vector<int>path;
    vector<vector<int>>res;
    void dfs(int i,int n, vector<int>& nums)
    {
        res.push_back(path); // 这里表示任意到一层,都算一种path答案
        if(i==n)
        {
            return; 
        }
        for(int j=i;j<n;j++)
        {
            // 枚举每次选的nums[i]
            path.push_back(nums[j]);
            dfs(j+1,n,nums);
            path.pop_back();
        }


    }
    vector<vector<int>> subsets(vector<int>& nums) {
        int n=nums.size();
        dfs(0,n,nums);
        return res;

    }
};

组合型回溯,相比子集型回溯,是有额外的一些限制(优化)条件的,常见条件:选k个数,选的数求和为target,针对这些条件进行一定的剪枝操作;

在这里插入图片描述

在这里插入图片描述
倒着枚举, 从n开始;剪枝操作

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> combine(int n, int k) {
        vector<vector<int>>ans;
        vector<int>path;
        function<void(int)>dfs=[&](int i)
        {
            int d=k-path.size();
            if(d==0)
            {
                ans.push_back(path);
                return;
            }
            for(int j=i;j>=d;j--) //减枝
            {
                path.push_back(j);
                dfs(j-1);
                path.pop_back();
            }
        };
        dfs(n);
        return ans;

    }
};

在这里插入图片描述
在这里插入图片描述

class Solution {
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        vector<vector<int>>ans;
        vector<int>path;
        function<void(int,int)>dfs=[&](int i,int t)
        {
            int d=k-path.size();
            if(t<0 || t>((i*2-d+1)*d/2))  // 不可能符合和为t的条件  减枝
            {
                return;
            }
            if(d==0)
            {
                ans.push_back(path);
                return;
            }
            for(int j=i;j>=d;j--) //减枝 ,个数不够k,
            {
                path.push_back(j);
                dfs(j-1,t-j);  // 和减去枚举的数
                path.pop_back();
            }
        };
        dfs(9,n);
        return ans;

    }
};

在这里插入图片描述

字符串
C++语法
digits[i] - ‘0’ 是一个常见的编程技巧,用于将字符型数字转换为整数型。
在ASCII码表中,字符’0’到’9’的编码是连续的,因此通过减去字符’0’的ASCII码值(即48),可以将字符型数字转换为对应的整数值。
digits[i] + ‘0’ 是将整数型数字转换为字符型数字的技巧。
在ASCII码表中,字符’0’到’9’的编码是连续的,因此通过加上字符’0’的ASCII码值(即48),可以将整数值转换为对应的字符型数字。

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

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

相关文章

线程间同步的方式有哪些?

Linux 系统提供了五种用于线程间同步的方式&#xff1a;互斥锁、读写锁、自旋锁、信号量、条件变量 互斥锁 主要用于保护共享数据&#xff0c;确保同一时间内只有一个线程访问数据。 互斥量本质上来说就是一把锁&#xff0c;在访问共享资源前对互斥量进行加锁&#xff0c;访…

【go-zero】win启动rpc服务报错 panic: context deadline exceeded

win启动rpc服务报错 panic: context deadline exceeded 问题来源 在使用go-zero生成的rpc项目后 启动不起来 原因 这个问题原因是wndows没有启动etcd 官方文档是删除了etcd配置 而我自己的测试yaml配置有etcd&#xff0c;所以需要启动etcd 下载安装好etcd后&#xff0…

Java Full GC 的常见原因及优化策略

Java Full GC 的常见原因及优化策略 1、导致Full GC的常见原因1.1 新生代设置过小1.2 新生代设置过大1.3 Survivor区设置不当 2、优化GC策略2.1 吞吐量优先2.2 暂停时间优先 3、结论 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java应…

自控原理-传递函数(闭环 扰动 偏差 前馈 复合 顺馈)

都知道闭环传递函数定义为&#xff1a;G1G2/(1G1G2H) 但是当碰到复杂的系统&#xff0c;比如复合顺馈&#xff0c;前馈扰动等&#xff0c;就不知道分子到底要不要乘上G2了。 这个公式是如何推导出来的&#xff0c;今天看到一个公式图片&#xff1a; 过程非常详细。 由此我也…

C语言遇见的一些小问题

问题如下&#xff1a; 1&#xff1a;为什么这样的代码为报错 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <algorithm> #include <cstdio> #include<string> #include<stdlib.h> using namespace std; int main() {int i …

C语言 ——— #define定义标识符

目录 #define 定义常变量 #define 定义字符串 #define 定义一条代码 #define 定义的标识符是否需要加分号 #define 定义常变量 代码演示&#xff1a; #define M 100 //定义常变量 代码用途&#xff1a; int a M; int arr[M] { 0 }; 此时的 M 具有常属性&#xff0c…

什么是UART?

1.什么是UART&#xff1f; 通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;通常称作UART。UART 表示通用异步接收机/发射机&#xff0c;定义用于在两个设备之间交换串行数据的协议或一组规则。UART 非常简单&#xff0c;仅在发射机和…

C语言中static与extern关键字的深入解析

在C语言编程中&#xff0c;static和extern是两个非常重要的关键字&#xff0c;它们各自有着独特的用途。本文将深入探讨这两个关键字的工作原理、底层实现机制以及在实际开发中的应用。 static关键字 1. 原理与作用 static关键字用于声明变量或函数具有特定的作用域和生命周…

5.4分段线性灰度变换

目录 实验原理 分段线性灰度变换的概念 变换函数的形式 示例代码1 示例结果1 示例代码2 示例结果2 示例代码3 运行结果3 示例代码4 运行结果4 实验原理 在OpenCV中&#xff0c;分段线性灰度变换&#xff08;Piecewise Linear Gray Level Transformation&#xff09…

GitLab 是什么?GitLab使用常见问题解答

GitLab 是什么 GitLab是由GitLab Inc.开发&#xff0c;使用MIT许可证的基于网络的Git仓库管理工具开源项目&#xff0c;且具有wiki和issue跟踪功能&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。 ​GitLab 是由 GitLab Inc.开发&#xff0c…

【Prometheus】Prometheus的特点、数据采集方式、架构、数据模型详解

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

vue3整合antv x6实现图编辑器快速入门

安装&#xff1a; npm install antv/x6 --save如果使用 umd 包&#xff0c;可以使用下面三个 CDN 中的任何一个&#xff0c;默认使用 X6 的最新版&#xff1a; https://unpkg.com/antv/x6/dist/index.jshttps://cdn.jsdelivr.net/npm/antv/x6/dist/index.jshttps://cdnjs.clo…

从汇编层看64位程序运行——likely提示编译器的优化案例和底层实现分析

大纲 代码分析with_attributes::powno_attributes::pow分析 我们在《Modern C——使用分支预测优化代码性能》一文中介绍了likely提示编译器进行编译优化&#xff0c;但是我们又讲了最终优化不是对分支顺序的调换&#xff0c;那么它到底做了什么样的优化&#xff0c;让整体性能…

个人旅游网(5)——功能详解——购物车功能

文章目录 一、设计购物车二、购物车对redis的一系列操作三、购物车3.1、接口详解3.1.1、addCart&#xff08;将当前旅游路线加入到购物车中&#xff09;3.1.2、showCartItem&#xff08;显示刚刚加入购物车的商品&#xff09;3.1.3、findAll&#xff08;将购物车里的所有旅游路…

骨灵冷火!Solon Cloud Gateway 照面发布

骨灵冷火&#xff0c;是练药的好火哟。极冷&#xff0c;又极热。在冰冻中被烧死&#xff1a;&#xff09; 1、认识 Solon Cloud Gateway Solon Cloud Gateway 是基于 Solon Cloud、Vert.X 和 Solon Rx(reactive-streams) 接口实现。小特点&#xff1a; 纯响应式的接口体验流…

KAN学习Day1——模型框架解析及HelloKAN

说明 最近了解到了一个新东西——KAN&#xff0c;我的毕设导师给推荐的船新框架。我看过很多剖析其原理的文章&#xff0c;发现大家对其持有的观点都各不相同&#xff0c;有的说可以颠覆传统MLP&#xff0c;有的说可以和Transformer同等地位&#xff0c;但是也有人说它训练速度…

YoloV8改进策略:IoU改进|Unified-IoU用于高质量对象检测

摘要 Unified-Unified-IoU&#xff08;UIoU&#xff09;是一种新的边界框回归损失函数&#xff0c;旨在改进目标检测任务中的预测框质量&#xff0c;特别是在高IoU阈值和IoU&#xff08;UIoU&#xff09;是一种新的边界框回归损失函数&#xff0c;旨在改进目标检测任务中的预测…

nginx的基本使用示例(负载均衡,虚拟主机,动静分离)的详细配置过程

文章目录 前言前置工作httpd主机tomcat主机 nginx主机配置负载均衡配置过程效果展示 虚拟主机配置过程效果展示 动静分离配置过程 排除思路 前言 本篇博客展示nginx的基本使用案例&#xff0c;后端由httpdtomcat组成&#xff0c;linux版本: rocky9.2 虚拟机ipnginx192.168.10…

安防监控视频打手机检测算法核心技术打手机检测算法源码、模型简介

在数字化的今天&#xff0c;智能手机几乎已成为人们生活中不可或缺的一部分。然而&#xff0c;手机的广泛使用也带来了一些挑战&#xff0c;比如在公共场所、教育机构和工作环境中的手机干扰。为了解决这些问题&#xff0c;打手机检测算法应运而生&#xff0c;成为管理人员和机…

hive学习(六)

一、函数 1.单行函数 特点&#xff1a;输入一行&#xff0c;输出一行&#xff08;一进一出&#xff09; 可分为日期函数&#xff0c;字符串函数&#xff0c;集合函数&#xff0c;数学函数和流程控制函数等 1&#xff09;算术运算函数 2&#xff09;数值函数 --round函数 …