自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 A* floyd算法 bellman-ford

流程就是每次遍历每一条边,看看能不能缩小某两点距离,进行n-1轮操作后,一定可以松弛所有边的距离。bellman-ford可以解决单源最短路问题,比dj算法强在可以解决负边。floyd任意两点最短,不能有负环,可以有负边,距离就会变成无穷负。排序的里面要加上与目标点一个预估距离,与dj算法差距只有这儿。预估要小于等于真实的最短距离,吸引力要适当。中间点最先枚举跳板点,看能不能缩短距离。就是哪条点动过了就在下一轮优化。判断是否存在负环时候也可以用。求源点到目标点最短距离。

2025-03-16 17:24:24 188

原创 蓝桥杯枚举

一个个枚举,要求奇数位是奇数,偶数位是偶数。最好要写三层循环,分别枚举年月日。逐天处理每个日期,注意处理闰年。

2025-03-16 15:10:36 193

原创 双向广搜

从两侧同时展开,那测数据少就从哪侧展,两者展开结果出现一样的,返回答案。由于这道题目的数据范围过大,达到10的9次方,所以动态规划方法无法通过。第二种用法:分成左右两半时暴力展开,把所有结果再整合再一起。最接近目标的子序列和。

2025-03-14 20:42:15 157

原创 宽度优先遍历扩展

其实先把所有字符串都排序,然后按照拥有的字符来建图,每次把能消去前缀的词选上,然后一直向下扩散。先把边缘的行列都放入小根堆,小根堆根据木桶的高度排,每次弹出一个堆顶元素,结算答案。按层扩散 或者一次一次扩散,按层就是要记下每次距离 (单点弹出,整层弹出)先把所有单词存入一个哈希表,便于去直接查找需要变化的单词。使用特征为任意节点距离都相同 有单源也有多源。一面墙相当于权值为1的边,空地相当于权值为0的边。边的权值只有0和1两种类型,求两点之间最短路。遇到零的边要从头部进,给了一步修改对的机会。

2025-03-14 17:12:15 201

原创 根据数据量猜解法 天字第一号技巧

由于他要求平方也是一个回文数,所以可以从他的根号下开始枚举,由于是回文数,所以也可以从他的一半来枚举。把所有的long范围内的超级回文数全部收集起来然后一个个检查,收集到所有结果。由于总共才10种招数,把10种招数进行全排列,10!各种语言的操作量限制均大约为10^8左右.超过了这个数量则运行不通过。由于数据范围是1到10^18-1,所以直接一个个来枚举一定会超时。

2025-03-13 20:35:44 257

原创 左程云 对数器打表找规律

适用情况,输入参数是简单类型,输出也是简单类型,只需要最基本的暴力递归方法,来获取最优的解决方案。有装下8个苹果的袋子、装下6个苹果的袋子,一定要保证买苹果时所有使用的袋子都装满。对于无法装满所有袋子的方案不予考虑,给定n个苹果,返回至少要多少个袋子。每只牛在自己的回合,吃草的重量必须是4的幂,1、4、16、64....草一共有n的重量,两只牛轮流吃草,A牛先吃,B牛后吃。谁在自己的回合正好把草吃完谁赢,根据输入的n,返回谁赢。返回长度为n的所有可能的字符串中,好串有多少个。可以观察到只有2的幂不能构成。

2025-03-13 18:34:54 240

原创 左程云 滑动窗口

要求每种字串出现的数量都超过k次,由于字母只有26种,所以可以一个个尝试字符有1种 2种一直到26种的情况。不定长滑动窗口,要求最短,那就应该不断地遍历收集r位置的数,然后缩小左边界,直到不能缩小为止,统计答案。每次进一个字符时候,查找上一次这个字符出现的位置,作为此时的l,结算答案,更新该字符上一次出现的位置。和最小覆盖字串题目一样,就是看那几个字符串超过了n/4,然后去找包含超过了的字符串的最短子串。这个题做一种转化,那就是小于等于k种字符的字串的个数,然后减去小于等于k-1种字符子串的个数。

2025-03-13 16:26:07 204

原创 左程云 双指针

把人从小到大排序,然后然后一个指针指向最左,一个指向最右,然后看看两个人合起来是否能同时上船,如果能,就把两个人同时上船,如果不能,则只上大的,然后右指针后退。把最后一个位置的数看成一个快递站,然后设立两个指针一个指向奇数位一个指向偶数位,如果最后一个位置的数为奇数则与奇数指针交换,偶数同理。弄两个指针一个l初始值为0,l的左边为已经排好的区域,r区域为没有用的垃圾区,r左边表示能排好序的最好预期。如果左边的最大值小于右边的,此时左边可以结算了,因为右边的最大值虽然不是实际上的,但只会比这更大。

2025-03-11 18:41:41 304

原创 最小生成树

点加入set 涉及的边加入小根堆 随便选一个点开始,弹出一条边,如果边所到的点已经在set中了。如果加入这条边后,会形成环,那就不加入这条边,如果不会形成环,那就加入,判断有没有环。k算法求最小生成树 k算法就是不停地选边,先把边从小到大排序,然后一个个看。把所有小于这个长度的边全部合并起来,然后看这两个元素是否属于一个并查集。在无向带权图中选择一些边,保持连通性情况下边的总权值最小。舍弃边,否则将点加入set再次进弹出边,直到heap为空。水资源分配,把水源点看成一个新点,并且有连向。

2025-03-07 17:02:46 188

原创 拓扑排序的扩展技巧,如何从上游传送到下游信息(未完待续)

最后一道难度较大,暂且跳过。

2025-03-06 22:26:38 179

原创 建图 链式前向星 拓扑排序

以每个点作为开头盖的章都会有正确的和错误的,倒着来看,最后一个章必须全为正确,可以视为入度为0,然后消去把这个章改对的影响作用后往前看,再找到一个入度为0的点。其实就是按照每个词的先后顺序建图,然后就能知道字母的先后顺序 注意就是在什么语言里面 abcd一定在abc后面出现不符合这种情况的直接退出。这个题就是要满足前后关系 所以满足拓扑排序的要求,先用领接表建立图然后用一个队列,每次把头弹出,消除影响后再逐个加入入度为0的点。领接表,就是用一个动态数组来构建,对于每个点都塞入他的相邻的点。

2025-03-06 17:15:09 187

原创 左程云 位运算 异或运算

这里用到了一个原理 当假设某个数最右侧的1000,那么一定还存在0111,0110...这样的话会导致最右侧的1及其之后的全部变为0,所以每次减去最右侧的1。可以把一个数这么看,该一位上是1,说明在该一位上有一个1,然后可以把相邻位置上右移加上这位,现在每两位的数就表示了这两位上有几个1。还是位运算的思想,如果一个把所有数32位出现次数全部统计出来,然后再取m的模,如果取模后的结果不为0,说明这一位数字为1。这一位1说明这两个奇数在这一位上不同,然后一个个找数,把这一位是1的数全部异或,就求出来一个数了。

2025-03-05 17:17:19 407

原创 左程云 并查集(未完待续)

需要发现的规律:当一个集合里面混杂了n对情侣后,需要交换n-1次就能获得,而所有集合里面的情侣总数加入为m,容易看出牵手数量就是所有情侣对数减去集合个数。如果一堆石头同行或者同列(属于一个集合),最后一定能移除的只剩下一个石头,所以最终的答案就是石头总数减去集合总数。并查集,也就是用来管理合并与查询的结构.刚开始,所有节点的父节点都指向自己,随着集合的合并,父节点指针将改变。怎么判断是否是一个集合,因为题目中的字符全是异位词,所以只要判断不同的词的个数是否为零个或者两个。移除最多的同行或同列石头。

2025-03-03 23:01:15 226

原创 左程云 常见经典递归过程解析 回溯

关键是每层怎么去选的问题,这里应该对于相同的字符,每层选择一个两个,然后跳转到下一层不相等的字符上面去。方法二:回溯时恢复现场比较麻烦,我可以直接记忆路径的末尾位置,这时候记录路径用一个char数组。规律就是,交换时候看看这个数字是否在之前已经遇到过,所以用一个哈希表来存放交换过的数字。说白了就是去了每一个位置都有选和不选两种可能性,记得如果选了,是要恢复现场。每一层都去和后面的交换,然后跑下一层递归,交换完后记得换回来。因为要求去重,所以这里用一个哈希表记录答案。记得哈希表要传引用类型。

2025-03-02 15:56:36 284

原创 左程云 最大公约数,同余定理

这道题使用二分答案法来做,计算一个区间内满足这个条件的数有几个,如果超过n个数的话,说明得去左边区间二分,否则去右边区间二分。对于a,b 把b的值赋给a,然后b赋上a%b,一直进行下去,直到最后b变成0,此时的a即为最大公约数。怎么计算有几个神奇数字:就是除以两个数的和减去除以他们的最小公倍数。最小公倍数 用最大公约数*最小公倍数=a*b进行计算即可。同余定理:就是对中间结果取模,等同于最后计算后的结果取模。区间最小0,最大为两数中的最小值乘以n。求最大公约数的方法:辗转相除法。

2025-03-01 19:13:02 164

原创 左程云 单调队列

队列从L口到R口依次递减,每次在右端加一个数,如果数比队尾的数大,就可以把队尾的数全部都弹出来,因为这个数又新又大,然后队头的数就是滑动窗口的最大的数。这是一个变长的滑动窗口的最大最小值的差的问题,每次往右边加数时候,窗口最大值一定增长或者不变,最小值一定减小或者不变。用一个从小到大组织的单调队列,当前的数和队头的数差大于k时候就让他走出队列,要满足这个且足够近。如果队列里没任务做了,就去吃药,然后选任务,去做里面最大的任务,不能让吃的药浪费。所以我们队列要存放两个数,一个i,一个yi-xi。

2025-03-01 18:29:37 348

原创 左程云 单调栈

这道题的要求是求左右两边比他小的最近的,由此可以看出这个栈应该是大的元素放在栈顶部,如果遇到重复元素,也应该把他压出栈,最后栈中如果还保留有元素,则应该清算里面的元素,因为有相同元素弹出的情况,所以应该从后往前检查所有元素是否符合条件。这个题其实就是求比他小且离着他最近的数,注意的是重复的元素也要一并弹出,虽然在当前这一步计算少了,但是后面的相同的数做计算就弥补过来了。这道题用了数组压缩的技巧,每次遍历每一行的数组,用来算以这行为底的矩形数量,如果这层为0,则变为0,否则为上层的高度加一。

2025-02-28 15:30:20 325

原创 左程云一维差分,二维差分,前缀和,等差数列差分

然后再left上加上这个数,在right+1上减去这个数,记得数组开大一点,前后包两个0,可以避免边界讨论。在1到n上上某个区间上都加一个数,比如说[left,right]这个区间上,解决方法就是构造一个差分数组。一个部分的和是0,说明是可以贴邮票,判断一部分和是0需要用前缀和数组,而贴邮票,就得在差分数组上面去贴。离散化加上二维差分,离散化,就是要把大范围的一群数都存到数组里面,防止空间爆炸。在一个区间上加上首项为s、末项为e、公差为d的数列。再做差分s d-s 0 0 0 -e-d e。

2025-02-25 16:37:35 274

原创 左程云前缀树

还是从最高位开始,要有一个理想数字better,这个better,然后去哈希表中找到这个理想数字是否存在。需要定义四个变量tree[maxn][26] pass[maxn] end[maxn] cnt。先找出最大的数,说明就只需要从这位最高的1开始考虑,从高位想着地位一直考虑。前缀树,就是根据字符串前缀来建立的n叉树,没有路就新建节点,有路就复用,很容易看出来,就是查看对于每个b中的数组,a中有几个数据以他为前缀。考虑到数字可能会有负数,且应该有分隔,所以应该要有符号#和-用数组或者哈希表实现。

2025-02-24 16:08:21 140

原创 左程云 二分搜索与二分答案

峰值意味着左边有一个往上增长的部分,右边也有一个往下减小的一段趋势,根据零点定理可以得到这段区间内有峰值,而且不需要排序。可以很自然的想到,吃的速度越快,肯定越容易吃完所有,吃的最慢肯定是l=1 最快的速度是所有香蕉中最大的一堆一小时吃完。这道题有一个误解,如果遵循有空位就上的原则的话,时间是一个固定值,因为不管前面人怎么选,最终相当于字母的变换顺序。这道题正着做很难,但是反着想的话,可以先想出最大值的范围,就是所有数字之和,最小值当然是0。// 并且你选择的所有毒杀效果,在之后的回合都会叠加。

2025-02-23 23:14:02 507

原创 左程云 基数排序整理

基数排序的过程就是把数先按最低位排序,依次放入十个桶里面,注意所有数里面应该没有负数,如果有的话应该全加上某个数让所有数都为正数,然后把这十个数再按十位数排序,记得要按刚刚桶倒出来的顺序,直到把所有的位数比完。

2025-02-16 22:29:30 135

原创 左程云堆结构与堆排序

线段最大重合问题,重合的边界,肯定有一条是某个线段的左边界,所以可以把所有线段,按左边界升序排列,每次扔进去一条线段,把右边界小于他的全部弹出,然后堆插入新的堆顶。将数组减半的最少次数,由于每次一定找最大的来减半,所以需要动态维护一个大根堆,然后每次都减半,注意要全部转化为double类型,因为奇数可能会造成四舍五入。要变成小根堆应该使用priority_queue<int,vector<int>,greater<int>> q;题目一 合并k个升序链表,这里想到的是要每次动态获得最小的值,所以想到用堆。

2025-02-16 21:28:58 265

原创 左程云快速排序 随机选择算法

快速排序的思路,就是根据数组里面随机一个数,把整个数组分为<=他的左部分,大于他的右部分。还是类似于荷兰国旗方法,把数分为三类,然后看是否属于中间部分。随机选择算法:求一个数组中第k大或第k小的数。然后依次对左部分以及右部分做同样的操作。第二种,荷兰国旗用三个边界优化版本。第一种,只用两个分界的版本。

2025-02-15 11:43:39 111

原创 左程云算法课归并排序,归并分治

题目一:小和问题,要求出每个数左边比他小的数的总和,因为左边有序的时候,可以把左边的sum一直求和,直到左边的数小于右边的,一个数组小和就是左边的小和加上右边的小和。归并排序,说白了就是左边排好序,右边排好序,然后把左右两边用两个指针谁小拷贝谁(先拷贝到一个辅助数组里),然后再把辅助数组里面的数拷贝回原数组中。归并分治:思考一个大问题是否可以分成左部分的答案加上右部分的答案加上跨越左右的答案。力扣493:翻转对数量,这个就是要针对每个i,来移动j。要考虑当左右两边有序时候,是否会简化计算过程。

2025-02-14 23:16:54 144

原创 剑指offer 第五章哈希表

erase(it)里面加入的是迭代器erase(st.find(100))里面也可以加要删除的值 st.erase(it,st.end()) 删除两个迭代器范围内的所有数。哈希表有两种形式set和map set用来存储不重复的值,map用来存储一对一的映射。一天的时间有1440个,所以可以准备一个长度为1440的数组,来判断某个时间是否存在。里面应该有一个哈希表,一个动态数组,哈希表存放每个数字到动态数组里面的键值对。里面的函数insert() find()返回的是迭代器。

2025-02-14 19:42:09 263

原创 剑指offer 第四章链表

双指针方法,由于两个链表只有前面的部分不相同,所以可以分别求出两个链表的长度,然后在长链表处优先移动指针,然后同时移动两个头指针,第一次相遇的地方就是入口处。在反转链表时候除了知道本节点,还要知道前一个节点,因为需要把next指针指向前一位,还需要知道后一位,因为不知道后一位的话链表会断裂,找不到之后的节点。知道环的长度的方法,就是用一快一慢两个指针来往前进,如果有环的话快的的相对距离超过慢的的一圈后,两个指针就会相遇,相遇后再绕一圈就能知道环的长度。有的面试题需要倒着遍历链表,所以需要反转。

2025-02-13 00:02:05 207

原创 剑指offer 第三章字符串

我们真正关心的是是否有一个字符超过1次出现,因此可以定义一个新的变量来计算超过1次的字符个数当超过一次的字符数是0个时此时字符串符合要求。类似于滑动窗口的做法,每次把一个长度为s1的滑动窗口划过s2字符串,逐渐判断这个字符串是否在s2中有相同的字母构成。所有字符总共256位因为char字符有8位,所以准备一个长度为256的数组 对于每个i指针的最长的j指针。最多删除一个字符得到回文,先判断是不是回文,如果不是,那就去不满足的地方去删除。方法一:类似于滑动窗口的做法,如果有重复的话,把后指针一直往前移动。

2025-02-11 12:04:22 144

原创 剑指offer 第二章数组

排序数组,一个从最低开始,一个从最高开始,如果两者的和不够的话,就把i往后移,此时会增加两者的和,超过的话就把j往前移动,减少两者的和,用o(n)和o(1)的复杂度解决。可以把数组中所有0都替换为-1,当0和1相同时候意思就是这段的和等于0,这里的哈希表保存的是和与下标的对应。双指针解决子数组之和前提条件是要数组的所有数全是正数,因此当数组出现负数时候不能用之前的方法。先固定一个数字i,再去数组中找和为-i的两个数字,注意先要排序,还要注意怎么跳过相同的值。数组中和为0的三个数字。

2025-02-10 11:32:38 126

原创 剑指offer专项突破版第一章,整数

还是位运算的思想,把所有数的每个32位的和都求出来,如果这个和能被3整除,说明这个数字这一位为0,要不然就是1。注意的要点有很多,对于符号来说,全部转化为负号,因为负数比正数表示的多一个,然后再调整正负号。二进制求和,这道题就是一个高精度加法的简化版本,只需要考虑遇到2则进一,以及最后的溢出进位。高效方法:用i&(i-1)可以把最右边的1变成0,看看能变过多少次之后原来的数变成0。由于每个整数有32位所以可以存下26位,用每个整数来保存每个单词的信息。这样时间复杂度降为logn。还可以用动态规划的思想。

2025-02-09 11:39:16 163

空空如也

空空如也

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

TA关注的人

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