自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(127)
  • 收藏
  • 关注

原创 dfs记忆化搜索刷题 + 总结

1. 记忆化搜索就是先把暴力的dfs先写出来,然后加一个备忘录优化2. 记忆化搜索也和常规的动态规划是一样的,即记忆化搜索也可以改为动态规划的代码3. 出现大量重复的数据可以使用记忆化搜索,记忆化搜索可以使原本O(2^n)时间复杂度降为O(n)

2025-03-31 17:07:44 743 38

原创 笔试专题(五)

2. 开始用贪心做的没想到是个错解,贪心是哪个礼包大就选哪个礼包知道这个礼包不够选,再选另一个礼包,比如反例 n = 2 m = 100 a = 3 b = 2,都选一号礼包就是3元,都选二号礼包就是4元。3. 依次枚举一号礼包的个数,再求出2号礼包的个数,1号礼包最大的数量是min(n/2,m),2号礼包剩下的数量是min(n-2*x,(m-x)/2)2. 可以先将整个字符串倒置,再倒置每个单词,使用reverse函数,begin()指向开始的第一个字符,end()指向单词最后一个字符的下一个位置。

2025-03-30 15:31:15 347 7

原创 笔试专题(四)

比如实例一,排完序之后是 0 0 2 4 6,先统计0的个数,如果非0两个数之差 4 - 2 - 1 = 1,中间相差一个数,用0补,如果不够补返回false,如果有多余的0返回true</font。1、考虑回文串长度的奇偶性,如果是奇数串,r = i + 1,l = i - 1,向两边扩展,如果是偶数串,l = i,r = i + 1,或者是 l = i -1,r = i。2、如果是贪心解的话,每次都算出前驱数组中的最小值,和当前数进行相减,算出每次的利润,可以得到最大值。1. 解法一:找规律。

2025-03-28 16:40:13 649 47

原创 洪水灌溉算法 + 总结

1. 学习到了正难则反的思想2. 寻找性质相同的联通块,通过dfs将其修改或是统计联通块的个数3. 无非都是通过4个方向或者是八个方向或者是2个方向上去搜索。

2025-03-26 18:49:37 1130 41

原创 笔试专题(三)

3. 解法三:一共有20中情况,但是会出现重复的情况比如012 - 345,这样就少了一半,就只有10中情况了,优化的解法可以先排序,分为下图的10种情况,第一列的012 - 345如果成立,那么后面的就不需要判断了,如果不成立,根据单调性如果 0 + 1 < 2的,那么后面的 0 + 1 < 3的,后面的也是如此。2. 解法一可以使用三层for循环和check判断,解法二可以使用dfs判断,解法三是对枚举的优化。1. 考察枚举,两边之和大于第三边。1. 考察双指针 + 模拟。

2025-03-25 22:34:48 612 40

原创 笔试专题(二)

1. 可以使用一个大根堆,把所有的偶数都加入到堆中,堆顶的元素就是最大的偶数,然后除2,再把堆顶的元素弹出,防止影响后面的数,sum再减去这个除2后的数,如果这个数除2后还是偶数,就把它重新加入堆中。5. 可以使用一个变量进行空间优化,f = 0 -> dp[1],只有一个孩子时,不管怎样他都是那个获胜的孩子,下标为0。2. 全局变量:vis标记使用过的字符,dx,dy表示向量,向上,向下,向左或者向右搜索。4. 递归出口:到达字符串的最后一个位置的下一个位置,表示字符串已经搜索完成。

2025-03-23 22:57:00 690 30

原创 dfs刷题矩阵搜索问题

1. 题目识别什么时候用矩阵搜索?当出现向上,向下,向左,向右搜索时可以使用2. 怎么使用矩阵搜索?上面的三题里做了,就是模版3. 如果是矩阵填空的题怎么做,例如N皇后?可以用bool数组标记填过的行列斜对角线检查是否有效,然后一层一层去搜索,这种题主要也是画决策树,就是多了几个bool数组检查使用过的格子,之后不再使用这个格子。

2025-03-23 15:27:18 1411 48

原创 dfs刷题排列问题 + 子集问题 + 组和问题总结

1. 最重要的就是画出决策树2. 全局变量:一般是path记录路径,ret记录各个路径的结果3. 剪枝:看题目分析和看决策树4. 回溯:一般是pop_back最后一个元素5. 递归出口:看题目条件,或者是叶子节点。

2025-03-21 23:18:29 1092 54

原创 高精度加法,高精度乘法,高精度除法,高精度减法,链表相加

1. 高精度加减乘都是从后往前处理的,唯独高精度除法是从前往后处理的2. 高精度减乘除法需要处理前导0,高精度加法不需要从处理前导0,比如823 + 242 -> 328 + 242 = 5601 -> 10653. 高精度加法逆序数组,处理进位,逆序打印,高精度减法,处理负号,逆序存储,处理借位,处理前导零,是否加负号,逆序打印数组,高精度乘法,无进位相乘再相加,处理进位,处理前导零,逆序打印,高精度除法,每次处理商,处理余数,处理前导零4. 基本的做题步骤:1、将数组逆置。

2025-03-17 21:54:28 1293 64

原创 穷举vs暴搜vs深搜vs回溯vs剪枝刷题 + 总结

dfs就分为五步:1. 画决策树:只要正确画出决策树就能写出正确的代码2. 全局变量:写出ret记录所有路径,path记录每次的路径,check标记是否使用过该位置3. dfs:函数头,根据决策树考虑使用几个参数,只关心某个节点在干什么的情况或者是某一条路径的情况4. dfs的函数体:根据决策树设计分析函数题如何写。

2025-03-15 23:30:36 1197 55

原创 栈刷题+总结

什么时候可以使用栈?1. 字符串表达式求值,括号匹配,删除相同的相邻元素,最近保存的先出去,都应该用栈来解决2. 需要处理最近或最后出现的数据3. 在DFS中,栈用于存储待访问的节点4. 检查字符串是否为回文5. 撤销操作: 需要支持回退功能怎么使用栈解决问题?1. 模拟2. 用字符串或者数组模拟栈,st.back(),st.pop_back(),st.push_back()3. 分情况讨论提取字符串中长数字字符转为整形的方法。

2025-03-15 11:25:54 743 41

原创 笔试刷题专题(一)

如果栈是空的,就加入st字符串的尾部,如果栈非空并且st尾部的元素和字符串中的元素相同就出栈,如果栈非空并且st尾部的元素和字符串的元素不同就入栈,模拟是不需要逆置的。4. 初始化:dp[0] = dp[1] = 0,因为从0或者1位置开始向后走,之前是没有花费的。注意 dp[i] 表示的是 i 位置之前的最小花费,还要加上该点的位置才是到达这个点的最小花费。,把栈中的元素取出来放入string中,最后需要逆置一下。1. 这题和括号匹配是类似的,都是两两消除。1. 状态表示:以i位置为结尾的最小花费。

2025-03-12 23:11:40 632 35

原创 位运算刷题+总结

1. 给你一个数n,确定这个数的二进制表示上的第x位是0还是1?(n>>x) & 1,== 0就是0,==1就是12. 将一个数n的二进制表示的第x位修改为1?3.将一个数n的二进制表示的第x为修改为0?4. 提取一个数n二进制表示中的最右侧的1?n & (-n) 左侧被n取反后再按位与之后都变成了0,1的右侧都加1都变成了05. 干掉一个数n二进制表示中最右侧的1?n & (n-1) 减一之后会向左边借1,借位的位置变为了0,它的右侧都变成了1,再按位与之后包括它本身都会变成0。

2025-03-12 18:28:52 1095 47

原创 二叉树中的深搜

1. 子问题是一个突破口2. 要从宏观角度看待递归更加好做3. 剪枝4. 回溯5. 从叶子节点看待问题更容易找到突破口6. 画图更容易有思路。

2025-03-09 23:16:32 1231 24

原创 递归专题刷题

1.什么时候使用递归?一个问题可以分成相同类型的子问题2. 怎么使用递归?1、重复的子问题->函数头的设计2、只关心某个子问题在做什么事情->函数题的设计3、递归的出口->返回条件。

2025-03-08 11:10:31 981 53

原创 动态规划路径问题

1. 路径问题对于状态表示:要么以[i,j]位置为结尾,根据题意(题目经验),根据前面的状态来填[i,j]状态,要么以[i,j]位置为起点,根据题意(题目经验),根据后面的状态来填[i,j]状态2.状态转移方程根据最近的一步划分问题3. 初始化:要么初始化上左两层,要么初始化左右上三层,要么初始化右下两层4. 填表顺序:要么从上往下,从左往右,要么从下往上,从右往左5. 返回值:要么返回最后一格的值,要么最后一层的某个格的值,要么返回第一格的值。

2025-03-07 14:34:11 1456 35

原创 双指针刷题和总结

3. 同向双指针,一个元素不需要去重直接返回,cur指针和i指针如果相同i就往后走,cur不动,如果不相同cur走到下一位置,i位置的指针赋给cur指针。1. 这题用栈也是可以的,先把第一个元素插入到空栈中,再和数组中的元素比较如果相同就不入栈,如果不同就入栈,就可以达到只保留一个数的目的。比较简单,如果栈为空,把元素插入到栈中,再和数组中的元素比较,如果相同就出栈,如果不同就入栈,最后剩余的元素就是答案。(就是直到找到不同的就给cur的下一个位置的指针,达到了不重复的效果)1. 很明显这题要用。

2025-03-03 21:24:58 662 54

原创 动态规划刷题

以i位置位置的状态,最近的一步来划分问题,比如可以将状态拆分成前状态来表示现状态,dp[i] = dp[i-1] + dp[i-2] + dp[i-3]3. 初始化:dp[1] = 1,dp[2] = 2,dp[3] = 4。线性dp的状态表示dp[i]都是以某个位置为开头或者以某个位置为结尾。1. 状态表示:以i为结尾,dp[i]是什么意思,是一共有多少种方法。:dp[i],表示dp表中i下标位置的值。5. 返回值:返回dp[n]的状态。4. 填表顺序:从左向右填表。

2025-03-02 22:33:51 519 16

原创 Linux 动静态库和_make_进度条(一)

4. 因为根据历史的发展,C语言如果直接编程二进制的机器语言成本太高了,那时候汇编的发展了几十年了,C语言变成汇编(然后汇编变成二进制是不需要我们处理的)打孔编程也叫二进制编程。上层中有.h文件和.o文件(包含了.c文件),可以实现功能main中调用函数,上层中把所有的.o文件打个包变成了可执行文件。是打包所有的.o文件(包括自己的.o和C语言库中的.o文件),和库C语言库中的.h文件一起形成可执行文件。2. lib是前缀,.so是后缀,中间的是c,就是C语言的库,是xyz,就是xyz的库。

2025-03-01 18:25:04 1771 14

原创 Linux开发工具(二)

9. 保存退出后还有之前注释的行,不能用u进行撤销了,可以进入视图模式,进行区域选择,然后用d进行删除注释10. 视图模式不仅可以进行批量化注释,还可以进行批量化补充代码,和第6点差不多的步骤。5. 首先在视图模式下进行区域的选择,按shift+i,进入到插入模式,进行注释一行,再按esc进入到命令模式,就可以进行刚才的区域的注释。i,o,a都可以进入插入模式,i保证光标在原来的行,o光标换行新起一行,a光标定位到下一个字符的位置。shift+3 = #,选中单词,高量出来,可以进行查找,n:逆向查找。

2025-02-28 17:57:50 1116 48

原创 Linux权限 -- 开发工具(一)

1.通过 yum list 命令可以罗列出当前一共有哪些软件包,由于包的数目可能非常之多, 这里我们需要使用grep 命令只筛选出我们关注的包。1. (vim是一款编辑器)退出vim:shift + :+ q + 回车 或者 大写的zz。1. vim有多种模式,插入模式,底行模式,命令模式,开始进入vim默认进入的是命令模式。2. 保存退出vim:esc + shift + :+ wq + 回车。2. 命令模式:是进行快速编辑的。3. 为什么会有配套的软件?2. 什么是包管理器?

2025-02-25 22:52:22 726 48

原创 前缀和刷题-- LeetCode

2. 先预处里一个前缀和和后缀和数组,定义一个left和right,去找前缀和后缀相等的数,并且要求最大值。1. 预处理前缀和和后缀和数组,注意边界问题,f(0) = 0,g(n-1) = 0。2. 然后遍历数组一遍,f[i] == g[i],i就是下标。3. 如果左边大扩大后缀和数组,如果右边大扩大前缀和数组。1. 一定要开long long,被卡数据了。3. 时间复杂度是:O(N)

2025-02-24 20:26:19 499 14

原创 Linux权限(一)

在centos下,用户的角色只确认一次,不会进行二次确认,顺序是拥有者,所属组,other,确认完之后看对应的角色是否有属性,就可以确认是否能够读,写,执行了。4. sudoers配置文件中,把用户添加到100行左右,就可以运行 sudo ls了,否则使用不了sudo ls,通过vim进入配置文件。2. 比如安装软件,安装到系统中,需要管理员root权限,这些命令其实只安装了一份,普通用户和超级用户可以同时使用。人人都是root自己即是管理员又是用户,是可被信任的。3. 第一个0是用户的,我们不用考虑,

2025-02-23 20:26:05 848 9

原创 Linux基本指令(三)+ 权限

3. -a或‒all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称。是指一个系统的基本组织结构,包括其组件、组件之间的关系、组件与外部环境的关系,以及指导系统设计和演进的原则,例如x64,AMD。bash是Linux当中的外壳程序,bash在Linux中是一个死循环,shell是外壳程序的统称。2. 拷贝完之后,需要输入另一台Linux机器的密码,之后就可以在另一台机器上看到压缩包。,使用档名,请留意,在 f 之后要立即接档名喔!

2025-02-22 21:42:11 1539 17

原创 单调栈刷题

1. 7 8 5 6 7 ,栈为空,栈中只有一个数没有数比它小,l[i] = -1,栈不为空,如果有数小于它,l[i] = a[i],左边的数要出栈,比如 2 6 6,相等的不能要,2. 栈不为空,满足两个条件,1. 有很多位的二进制数。3. 不支持加减乘除。

2025-02-21 16:30:21 271 6

原创 栈,优先级队列,map,set

1.先把元素push进栈中,如果栈非空并且栈中的元素按顺序和k相等就出栈,直到栈为空或者k!= sk.top()3. 是2就减少sum,pop,并且要判空,非空才能减,不然优先级对列会报错。1. 把数插入到set中,set会自动帮我们排好序的,然后输出就行了。2. vector可以把字符串按顺序输出。3. 第一次出现就插入到vector中。2. 是1就push,增加sum。1. map统计字符串出现的次数。1. 用sum统计篮子的重量。

2025-02-20 22:07:24 193 3

原创 Linux基本指令(二)

3. 指定区间拿取一部分内容,先把前510内容重定向到temp.txt文件中,再用tail 取结尾10行的内容,就可以拿到501到510行的内容了。1. 比如which去指定的目录下查找指定的命令,它是去/usr/bin目录下去查找命令的。1. head可以查看开头的几行内容,tail可以查看结尾的几行内容,也可以指定查看几行。2. +%Y:%m:%d_%H:%M:%S,查看年月日时分秒,:可以自己设置分隔符。6. 管道是内存级的,在内存中进行修改,不是磁盘级的,占据一定的内存空间。

2025-02-20 21:31:25 918 3

原创 Linux基本指令(一)

2. 相对路径:一非/为参照位置定位一个文件,比如下图本来要回退到113目录下找到server.cc,现在不用回退,直接用 . ./server.cc,在上级目录下可以找到server.cc。:多叉树中一个指针指向它自己,还一个指针指向前一个节点,根目录中那两个指针都指向自己,所以cd. .找不到上级目录。1. 绝对路径:以根目录为起点找到对应的文件,比如 /home/bit/test.c。拷贝二次同一个文件,如果src如果是一个目录的话,会把文件拷贝到目录的内部。

2025-02-19 18:07:51 1250 40

原创 Linux系统 -- 环境安装,xshell和多用户,基本的Linux指令和Linux的用处

1. windows和Linux都有一个特点:多用户操作系统(一台Linux可以被多个人使用)2. 次版本号:操作系统的内核代码发生了较大变化(比如增加了20个指令)2. 虚拟机,不太推荐,虚拟机入网,后期学了Linux可以使用。xshell是一个终端软件(终端软件可以是你写C++的黑框框)3. 云服务器,仿真的环境,就是进入企业之后的真实环境。1. 主版本号:操作系统的内核代码发生了巨大的变化。3. Linux在移动嵌入式领域的发展。2. 输入密码的时候密码是不会显示的。2.Linux操作系统是开源的,

2025-02-17 19:41:19 1344 39

原创 位运算,双指针,二分,排序算法

1. 就是每个数与上1判断低位是否是1,是1就加,否则不加,判断完后,这个数右移1位,再判断,直到这个数变为0为止。2.记录出现数字的次数,然后用次数控制循环,输出[ ]里的数就是存进去的数,可以按顺序输出了。2.这样保证了a[l] < x, a[r] >= x,后续可以判断a[r] == x。1. 使用unique之前要确保数组是有序的,有序的才能确保所有元素都是唯一的。2.unique会把重复的元素移动到数组的末尾,最后返回第一个重复元素的迭代器。1. 自己写一个排序的逻辑,自定义类型的排序。

2025-02-16 22:16:11 797 13

原创 C++智能指针原理和使用(续)

weak_ptr支持expired检查指向的资源是否过期,use_count也可获取shared_ptr的引用计数,weak_ptr想访问资源时,可以调用lock返回一个管理资源的shared_ptr,如果资源已经被释放,返回的shared_ptr是一个空对象,如果资源没有释放,则通过返回的shared_ptr访问资源是安全的。并且这些智能指针的实现原理是参考boost中的实现的。,但是这个对象的线程安全问题不归shared_ptr管,它也管不了,应该有外层使用shared_ptr的人进行线程安全的控制。

2025-02-12 14:46:37 1116 20

原创 C++智能指针的使用

1. 下面的程序中,new了以后,我们也delete了,但是因为抛异常导致后面的delete没有得到执行,所以就内存泄漏了,所以我们需要new以后捕获异常,捕获到异常后delete内存,再把异常抛出。,它是一种管理资源的类的设计思想,本质是一种利用对象生命周期来管理获取到的动态资源,避免资源泄漏,这里的资源可以是内存、文件指针、网络连接、互斥锁等等。4、weak_ptr弱(辅助解决shared_ptr的一个问题)指针,它不同于上面的指针,它不支持RAII,也就意味着不能用它直接管理资源,

2025-02-10 21:34:33 874 34

原创 C++异常详解

但是是不知道异常错误是什么。

2025-02-10 17:39:14 1336 26

原创 C++11详解(四) -- 新的类功能和包装器

则需要看这个成员是否实现移动构造,

2025-02-08 12:32:08 1126 12

原创 C++11详解(三) -- 可变参数模版和lambda

也可以写在全局,lambda 表达式语法使用层而言没有类型,所以我们一般是用auto或者模板参数定义的对象去接收 lambda 对象。来指出一个模板参数或函数参数的表示一个包,在模板参数列表中,class…或typename…2. 编译时递归包括展,其实也不是递归,因为每次都生成不同的函数重载,只是每次用自己这个函数进行传参(包扩展)函数参数包可以用左值引用或右值引用表示,跟前面普通模板一样,每个参数实例化时遵循引用折叠规则。3. lambda可以传给模版的参数,也可以传给auto,让auto自动推导。

2025-02-06 21:01:55 1216 12

原创 C++11详解(二) -- 引用折叠和完美转发

再结合引用折叠规则,就实现了实参是左值,实例化出左值引用版本形参的Function,实参是右值,实例化出右值引用版本形参的Function。3. 像f2函数一样,传左值是左值引用,传右值是右值引用,T&& x参数看起来是右值引用参数,但是由于引用折叠的规则,底层(强转和特化处理的)是这样处理的:如果是左值属性,就不动,如果是右值属性,就把左值属性强转为右值属性。假设实参是int右值,模板参数T的推导int,实参是int左值,模板参数T的推导int&,完美转发可以解决上述的问题。,不会让t的属性退化。

2025-02-05 20:58:31 1254 32

原创 C++11详解(一) -- 列表初始化,右值引用和移动语义

1. 需要注意的是在vs2019的release和vs2022的debug和release,下面代码会进一步优化,直接构造要返回的临时对象,str本质是临时对象的引用,底层角度用指针实现。2. 需要注意的是在vs2019的release和vs2022的debug和release,会直接将str对象的构造,str移动构造临时对象,临时对象移动构造ret对象,合三为一,变为直接构造。的成员变量的类,移动构造和移动赋值才有意义,因为移动构造和移动赋值的第一个参数都是右值引用的类型,

2025-02-04 20:51:41 825 28

原创 C++ 哈希封装详解

【代码】C++ 哈希封装详解。

2025-02-02 23:12:45 758 11

原创 C++哈希(链地址法)(二)详解

开放地址法的问题是你占别人位置,别人来了又占其他人的位置,链地址法就不用占别人的位置,自己位置可以存多个位置,用了链表挂了多个数据。设计哈希函数为了减少冲突,让更多的位参与运算,不管使用%不太接近2的幂次方的质数,还是用位运算计算都是可以的。当key是string/Date等类型时,key不能取模,那么我们需要给HashTable增加一个。缺点:虽然可以充分利用位置,但是还是要解决冲突的问题。,这个仿函数支持把key转换成一个可以取模的整形,头插,尾插都可以,这里用了头插。本质是跳跃探测,减少冲突堆积。

2025-02-01 22:12:53 1269 35

原创 C++ unordered_map和unordered_set的使用,哈希表的实现

如下图,我们删除30,会导致查找20失败,当我们给每个位置加⼀个状态标识{EXIST,EMPTY,DELETE} ,删除30就可以不用删除值,而是把状态改为 DELETE ,那么查找20时是遇到 EMPTY 才能停止,就可以找到20。一个好的哈希函数应该让N个关键字被等概率的均匀的散列分布到哈希表的M个空间中,但是实际中却很难做到,但是我们要尽量往这个方向去考量设计。如果往左走回绕到哈希表尾,用减,比如3-9,到5的位置停下,-6 + M,M == 11, -6 + M = 5。蓝色的四个位置连续冲突。

2025-01-29 22:02:25 9995 30

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除