![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode刷题算法
记录自己刷leetcode时候学习到的各种算法的笔记
loser与你
这个作者很懒,什么都没留下…
展开
-
单调栈
单调栈 就是利用一个栈来维持数据的单调性,任意时刻,栈中存放的元素都会是单调的。 单调栈适用于去解决在一串数字中,要获得某个数字其左右两边大小信息的问题,通常是可以将O(n^2)的问题去化为O(n)来解决。 比如,要获得所有数字左边离它最近的小于它的数,和右边离它最近的小于它的数这种问题,就可以使用单调栈。 让栈内保持单调递增,如果遇到小于栈顶元素的数(也就是它加入后会破坏单调性的情况),就出栈,然后记录栈顶元素的信息。对于栈顶元素来说,在栈中它下面压着的数是左边离它最近的小于它的数,而当前让它出栈原创 2021-09-27 17:24:59 · 224 阅读 · 0 评论 -
KMP算法
KMP算法 KMP算法就是利用一个next[]数组让子串str2没必要每次匹配失败之后都要去从头开始又和str1的下一个位置匹配,这样一种加速策略能够加速字符串的匹配。而next[]数组中,next[i]表示的是该位置之前的字符串中,前缀子串与后缀子串相同的最大长度。就比如下图,i位置的前缀子串与后缀子串相同的最大长度为2。也就是对于i来说,前缀从0开始往后走,后缀从i-1开始往前走,直到不相遇或者前缀后缀重合为止。 而既然i位置前面这段后缀与从头开始的前缀相等,只是到了i位置之后才匹配不到,而i位置原创 2021-09-23 16:43:06 · 82 阅读 · 0 评论 -
并查集
并查集 并查集要解决的问题就是并和查,并就是将两个集合合并成一个新的集合,查就是查两个个元素是否在同一个集合中。 因而其提供给用户的接口也应该为两个,一个isSameSet()方法用于查,一个union()方法用于并。 显然,如果是用链表来实现的话,并是一个O(1)的操作,但是查将会是O(n)的操作;而如果用哈希表来实现的话,查是一个O(1)的操作,但是并将会是O(n)的操作。因而,通常情况下使用的是类似链表+哈希表的形式。 原理就是设置头元素来表示一个集合的起始位置,初始情况下,每个元素就是自己集原创 2021-09-22 16:29:28 · 91 阅读 · 0 评论 -
前缀树
前缀树 前缀树,也就是字典树,用来搞单词统计或者匹配前缀时候很有帮助。树的节点可以用来保存一些辅助信息用来做题,而树枝则用来表示字符。 一般在刷题的时候,会遇到单词匹配或者单词统计之类的问题,此时的字符串会被限制为只是字母。这样的话树就更好来表示,就比如对于一个单词表[“a”, “aa”, “ab”, “ab” “b”, “ed”]可以用前缀树表示成下面这样 可以给节点附加pass和end分别表示有多少个字符串经过了该节点,以该节点上方的字符为结尾的字符串的个数。 代码如下: //前缀树 publi原创 2021-09-17 17:06:48 · 164 阅读 · 0 评论