算法与数据结构
文章平均质量分 86
个人的算法学习笔记。
黄俊懿
放下期待、不抱希望地努力,踏踏实实,能走多远是多远。
展开
-
算法与数据结构32:动态规划的通过外部信息简化尝试
现在要求你戳破所有的气球。这一题,也是依赖到左边信息和右边信息的,如果没有左边信息和右边信息,就没法准确得出最优得分,比如L~R范围上消除,但是L-1及其前面可能有连成一片与L相同的,但是我们不知道,右边也是。比如现在有数组 [2, 3, 5, 2, 1],现在决定最后打爆3,那么递归调f(0, 0)和f(2, 4),得到这个尝试的答案 f(0, 0) + 3 + f(2, 4)此时补充一个外部条件简化尝试:S,i与右侧(i+1)数的关系, 0表示小于右边的数,1表示等于右边的数,2表示大于右边的数。原创 2022-12-11 11:59:37 · 537 阅读 · 0 评论 -
算法与数据结构31:DC3算法生成后缀数组
假设有字符串 aabaabaa那么从每个位置开始,到结尾位置,截取后缀串,可得aaabaaabaaaabaabaabaaabaabaaaabaabaa然后根据字典序对后缀串进行排序,排序结果放入数组中,数组中的值表示后缀串的开头位置那么这个数组,就是后缀数组对一个字符串求后缀数组,求实就是对一个数组求后缀数组,因为字符串里面每个字符都对应衣蛾ASCII码,也就是一个ASCII码数组假设有数组那么后缀串就是10327 103。原创 2022-12-11 00:53:06 · 1074 阅读 · 0 评论 -
算法与数据结构30:动态规划状态压缩技巧
在 “100 game” 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和 达到或超过 100 的玩家,即为胜者。但是可以压缩的前提是,数组(或List)中的每一个值,都是0/1,true/false,等非黑即白的简单状态。而且可以进行状态压缩的前提是,线性结构里的每个值,都是简单的0/1,true/false,等表示状态的。还是一样的套路,先把代表城市去没去过的citys数组,压缩为一个整形,用二进制位存储该城市起没去过。这种需要进行状态压缩的题是非常难的。原创 2022-12-10 20:16:34 · 578 阅读 · 0 评论 -
算法与数据结构29:四边形不等式技巧
如果回退了,左部分更小,但是得到的答案更大,那么上一轮也应该在在前一个位置,因为上一轮的前一个切分位置的左部分累加和也是这个,而右部分的累加和反而增加了,那么不管minSum是左侧还是右侧,都比切分位置往后移一位要大,而这个结论是和当前这种情况的前提是相违背的。所以求dp[1][3],就看dp[1][1]+dp[2][3]、dp[1][2]+dp[3][3],谁更小,再加一个1~3范围的累计和。s[i]=在arr[0…dp[0][3]同理,0~0和1~3合并,0~1和2~3合并,0~2和3~3合并。原创 2022-12-10 17:16:07 · 377 阅读 · 0 评论 -
算法与数据结构28:卡特兰数、数组累加和问题、矩阵技巧
题目一主要技巧:利用单调性优化题目二主要技巧:利用预处理结构优化题目三主要技巧:假设答案法+淘汰可能性。原创 2022-12-10 00:46:05 · 636 阅读 · 0 评论 -
算法与数据结构27:打表找规律技巧、根据数据量猜解法
1、某个面试题,输入参数简单,并且只有一个实际参数2、要求的返回值类型也简单,并且只有一个3、用暴力方法,把输入参数对应的返回值,打印出来看看,进而优化code小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有任意数量。能装下 6 个苹果的袋子,能装下 8 个苹果的袋子。小虎可以自由使用两种袋子来装苹果,但是小虎有强迫症,他要求自己使用的袋子数量必须最少,且使用的每个袋子必须装满。给定一个正整数 N,返回至少使用多少袋子。如果 N 无法让使用的每个袋子必须装满,返回 - 1一般做法就是一上来原创 2022-12-07 23:20:57 · 691 阅读 · 0 评论 -
算法与数据结构26:有序表
存储key-value键值对根据key进行排序,保证加入的元素在表中有序排列最简单的有序表树状每个节点的key都大于它的左子树的key每个节点的key都大于它的右字树的key如果是叶子节点,直接删除。如果只有一个孩子,有左无右、有右无左,那么让它的孩子替代它。如果两个孩子都有。找到右树上的最左节点,让这个节点去替代删除的节点,但是注意这个最左节点有可能有右节点,要先把这个右节点挂到它的父节点下。二叉搜索树的瓶颈来自于它的树高而树高又受添加元素的顺序影响如果添加的顺序是1、2、3、4、5…那么就原创 2022-12-04 19:16:24 · 924 阅读 · 0 评论 -
算法与数据结构25:资源限制类题目
1、布隆过滤器用于集合的建立与查询,并可以节省大量空间2、一致性哈希解决数据服务器负载管理问题3、利用并查集结构做岛问题的并行计算4、哈希函数可以把数据按照种类均匀分流5、位图解决某一范围上数字的出现情况,并可以节省大量空间6、利用分段统计思想,并进一步节省大量空间7、利用堆、外排序来做多个处理单元的结果合并32为无符号整数的范围是0~4294967295,现在有一个正好包含40亿个无符号整数的文件,可以使用最多1GB的内存,怎么找到出现次数最多的数?排序?不行,内存只有1G,无法在内存排序原创 2022-12-04 11:13:58 · 514 阅读 · 0 评论 -
算法与数据结构24:哈希函数
SHA-384SHA-224SHA-256MD2SHASHA-512MD5可以把数据根据不同的值,集合几乎均匀的分开1、输入域无穷大,输出域相对有限2、相同的输入,一定导致相同的输出,没有随机成分3、有可能不同的输入,有相同的输出4、大量的相似的不同输入,输出在输出域上离散分布,对输出结果取模,取模完以后也是均匀分布的存储:1、有一个初始化的桶区域,假如长度172、桶区域中每个桶都是一个单链表3、接收一个输入作为key,根据key算出一个hash值,然后对hash值取模 hash %原创 2022-12-04 08:16:36 · 232 阅读 · 0 评论 -
算法与数据结构23:IndexTree、AC自动机
用于快速查询区间累加和如果不用IndexTree,一般的做法是生成一个前缀和数组比如原数组arr = [3, -2, 1, 5, 0]那么前缀和数组help = [3, 1, 2, 7, 7]如果此时要查3~4的累加和,只需help[4] - help[2]但是这样有个问题,如果arr数组的某个值修改了的话,那么help数组的一大片区域都要跟着变,比如现在修改arr数组 arr[2] = 3,那么help数组下标2后面的都要跟着改变。这里的arr和help两个数组长度都是5,如果长度很长的话,效率就会原创 2022-12-03 23:33:31 · 305 阅读 · 0 评论 -
算法与数据结构22:线段树
以O(logN)的时间复杂度对数组区间进行增加、修改、查询普通的数组操作是要O(N)复杂度的原理就是把数组组织为一颗树,数的每个节点对应数组不同区间,增加、修改、查询在数的节点上进行线段树中,数组0位置一般是不使用的但是不会组织为真正的树状结构,而是组织为堆,下标从1开始,记为sum数组下标0格子代表原数组1~5的累加和下标1格子代表原数组1~2的累加和…如果此时要对某一范围进行增加操作 add(L, R, V)要在组织一个跟sum数组一样长的lazy数组,表示懒更新信息把该增加操作视为原创 2022-12-03 19:06:54 · 160 阅读 · 0 评论 -
算法与数据结构21:Morris遍历
Morris遍历是用于节省二叉树遍历的时候的空间的如果是常规的二叉树遍历,不管是递归还是迭代实现的,空间复杂度都是O(M),M是树的高度,因为每一个节点都会回到它三次,遍历的先后序的不同就是在这三次中的哪一次访问这个结点// 第一次process(node.left)// 第二次process(node.right)// 第三次因此需要有一个存储当前节点,当回到当前节点时则从栈中弹出栈中会压入多少个节点,又树高决定而Morris遍历就是对二叉树遍历的空间复杂的优化Morris遍历是利用树中节原创 2022-12-03 16:27:37 · 168 阅读 · 0 评论 -
算法与数据结构20:bfprt算法、蓄水池算法
这一题的最优解就是改写快速排序取一个基准数v,对数组做partition,大于v的放右边,小于k的放左边,等于v的放中间然后看等于区域是否包含k这个位置如果k这个位置在等于区域中间,那么返回v否则看k在等于区域左边,还是在右边,在左边就对左边部分进行partition,在右边就对右边部分做partition,如此一直到等于区域包含k这个位置时间复杂度为O(n),因为不需要像真正快排那样两边都做partition,只要对一边做partition,而且等于区域包含k就返回给定一个整形数组,返回其中第K小原创 2022-12-03 13:13:33 · 148 阅读 · 0 评论 -
算法与数据结构19:Manacher算法
Manacher算法,是一个用于快速寻找一个字符串中的最长回文子串的算法回文就是一段文字,将它逆序之后,还是跟原来的一样,就是回文而回文子串就是一个字符串中,连续的一段回文比如在abc123321def中,最长回文子串就是123321寻找最长回文子串,暴力解:尝试每个字符往左右方向扩,直到扩不动但是当回文是偶数长度时,这种方法是有问题的:没有办法指到ck中间的虚轴,因此得不到最长回文子串长度为4的结果解决办法是中间添加一个分割符,例如#:添加中间分隔符后,就可以指到代表虚轴的#字符,ck原创 2022-12-03 08:50:17 · 166 阅读 · 0 评论 -
算法与数据结构18:KMP算法
当匹配当不相等的位置,根据next数组保存的前后缀串匹配长度,匹配串可以往右推,前后缀串匹配的部分不需要再比较,而原来的指针保持不变(指针不回退)直到遇到next[0]的-1,表示指针指向的开头不可能匹配成功,换一个开头(指针后移),重新匹配。k前面的 abcabc,前面的abc和后面的abc相等,是前缀与后缀串匹配的最大长度。匹配串往右推,相当于匹配串指针往回跳,根据next数组的值往回跳。如果依然不匹配,同样的操作,根据next数组,把匹配串往右推。还是要比较到匹配串第三位,才知道匹配失败。原创 2022-12-03 00:00:58 · 284 阅读 · 0 评论 -
算法与数据结构17:斐波那契数列
【代码】算法与数据结构16:斐波那契数列。原创 2022-09-18 14:09:58 · 412 阅读 · 0 评论 -
算法与数据结构16:单调栈
1、利用单调栈,栈元素是list,防止数组中有相同的数字,相同的数字会放到同一个list里面去。4、如果栈顶元素对应数组中的数字与压入的下标对应的数字相等,放到栈顶list的尾部。5、如果要压入的下标对应的数字比栈顶元素对应的数字大,单独组成一个list压入栈中。3、如果栈顶元素对应数组中的数字比当前压入的下标对应的数字大,则弹出栈顶元素结算。2、循环遍历数组中每个数。原创 2022-09-18 07:34:39 · 402 阅读 · 0 评论 -
算法与数据结构16:滑动窗口
【代码】算法与数据结构16:滑动窗口。原创 2022-09-17 21:02:32 · 411 阅读 · 0 评论 -
算法与数据结构15:动态规划
*** 给定一个整形数组,代表一串纸牌* 有A、B两个玩家,从中抽取纸牌,但是每次只能拿最左或者最右* 假设两个玩家双方博弈* 求最后获胜方的结果值/*** 先手拿牌* @return} /*** 后手拿牌* @return} /*** 暴露递归* @return} /*** 动态规划* @returni < n;right ++;} }原创 2022-09-17 17:13:11 · 231 阅读 · 0 评论 -
算法与数据结构14:递归
图加代码注释,解析关于递归的算法的8个问题:1、汉诺塔问题2、不使用额外空间使得栈中元素逆序3、给定一个字符串,返回所有不重复的子序列4、给定一个字符串,返回不重复的全排序5、字符串的数据转化为字母的结果6、背包问题(递归求解)7、N皇后问题(位运算求解)8、纸牌游戏原创 2022-09-03 10:25:17 · 920 阅读 · 0 评论 -
算法与数据结构13:图
4、取出该点的所有邻接点,遍历并判断邻接点是否未进入过堆,是则直接翻入堆中然后进行堆调整;如果该节点在堆中但是未弹出,则判断当前算出的距离(当前弹出的node与原点的距离 + 该邻接点与当前弹出结点间的边的权重)是否更小,是则更新该节点在堆中记录的value(与原点的距离)并进行堆调整;3、循环判断堆是否为空,不为空则弹出一个节点并进行堆调整,此时该节点到原点的距离就是最短距离,放入结果集中。1、定义一个堆,并且该堆可以调整元素的value(到原点的距离),然后重写排序。原创 2022-09-01 22:52:16 · 243 阅读 · 0 评论 -
算法与数据结构12:并查集
union(T a, T b),把a样本和b样本所在的集合合并成一个集合。isSameSet(T a, T b),返回两个样本是否在一个集合中。用最小代价实现isSameSet、union两个方法。有两个方法:isSameSet、union。一开始每个都是自己为一个集合。有如果样本,类型为T。............原创 2022-08-06 21:59:38 · 144 阅读 · 0 评论 -
算法与数据结构11:贪心问题
."代表居民楼,需要照亮并且可以放灯,灯可以照亮当前位置,以及前面后后面一个位置。给定一个字符串,代表一条街道,字符串中只有"."或者"x"两种字符,每场会议都有开始时间和结束时间,安排会议日程,要求安排的场次最多。一个会议室,若干场会议,会议室同一时间只能安排一场会议,给定一块金条,切分它需要花费和金条长度值一样的铜板个数。给定一个整形数组costArr,代表项目启动资金,一个整形数组profitsArr,代表项目利润。给定一个数组,代表每个人期望分得的金条。"x"代表墙,不需要照亮并且无法放灯。....原创 2022-08-06 21:54:03 · 140 阅读 · 0 评论 -
算法与数据结构10:树形DP
求派对的最大快乐值(所有来参加派对的员工的快乐值之和)3、每个员工都有自己的快乐值,0个或者若干个直接下级。1、一个公司开派对,可以决定某个员工来或者不来。2、如果一个员工来,则直接下级不能来。..................原创 2022-07-31 17:57:36 · 129 阅读 · 0 评论 -
算法与数据结构09:二叉树
拿一张纸条,对折N次,然后从上往下,打印折痕的方向,折痕向下,打印down,折痕向上,打印up。原创 2022-07-31 15:22:20 · 109 阅读 · 0 评论 -
算法与数据结构08:链表问题
3、通过快慢指针,然慢指针指向链表中间节点,然后把后把部分的节点的next指针反转,再用两个指针,一头一尾,遍历进行比较,比较完毕后还原后半部分节点的next指针。处理逻辑都一样,都是设置一个快指针和一个慢指针,快指针每次遍历两个结点,慢指针每次遍历一个结点,当快指针无法往后遍历时,返回慢指针指向的节点。2、通过快慢指针,然慢指针指向链表中间节点,然后只把后半部分节点压入栈中,与列表节点进行比较,节省一半空间。3、输入链表头部,奇数长度返回中点前一个,偶数长度返回上中点前一个。.........原创 2022-07-31 08:53:43 · 227 阅读 · 0 评论 -
算法与数据结构07:前缀树,计数排序与桶排序
4、创建一个help数组,从后往前遍历原数组,得出d数位上的数i,然后根据count[i]得知,d数位上的数小于等于i的有count[i]个,则在数组help下标为count[i]-1的位置放入当前遍历的数,然后count[i]减一,表示d数位上的数小于等于i的还剩count[i]-1个没处理。桶排序是计数排序的一种应用。2、遍历数组每一个数的d数位上的数,创建一个count数组,下标为d,记录d数位上的数出现的次数,count[i]此时就是d数位上的数位i的出现了几次。1、假设当前数位为d。......原创 2022-07-24 23:06:32 · 246 阅读 · 0 评论 -
算法与数据结构06:堆与堆排序
代码】算法与数据结构06堆与堆排序。原创 2022-07-24 16:35:36 · 240 阅读 · 0 评论 -
算法与数据结构05:递归、归并排序与快速排序
给定一个数组,并且给定一个基准值,数组中小于该值的数放左边,大于该值的数放右边,等于该值的数放中间,然后返回中间等于该值的区域的左右边界。可以把数组最小和的求解转化为求每一个数右边有多少个数比它大,然后就累加多少次该数自身的值,得到的也是数组最小和。求数组最小和,就是遍历每一个数,然后把当前这个数左边比它小的数累加,得到结果值,该值就是数组最小和。借助归并排序,就可以很轻松的求出左边的数,在右边数组有多少个数比它大。......原创 2022-07-24 09:05:25 · 176 阅读 · 1 评论 -
算法与数据结构04:栈和队列
用两个栈来实现,一个用于压入元素,一个用于取出元素,当取出元素时,发现获取元素的栈为空,则一口气把压入元素的栈中的元素全部倒入获取元素的栈中,这样就可以保证元素的先入先出顺序。......原创 2022-07-22 21:05:28 · 262 阅读 · 0 评论 -
算法与数据结构03:链表
代码】算法与数据结构03链表。原创 2022-07-20 22:47:01 · 189 阅读 · 1 评论 -
算法与数据结构02:位运算
因为相同的数做异或运算,得出的结果是0,而任何数跟0做异或运算,得出的结果都是该数自身,所以遍历数组中所有的数,进行异或运算,最后得出的结果就是出现了奇数次的数。原创 2022-07-20 21:54:34 · 860 阅读 · 0 评论 -
算法与数据结构01:二分法
二分法原创 2022-07-20 00:32:02 · 223 阅读 · 0 评论