- 博客(12)
- 收藏
- 关注
原创 LeetCode做题记录 06
最长回文子串点击这里查看原题题目描述给定一个字符串s,输出它最长的回文子串Manacher(马拉车)算法其实本篇文章注重想讲讲这个Manacher算法。其实这个题目我们容易想到,遍历字符串s的每一个字符,假设遍历到s[i],那么就把这个字符当做回文中心,即回文串的对称轴,然后从两边开始扩张,直到不是回文的为止,记录下来最大长度的起点与终点即可,这种算法叫中心扩展法。中心扩展法还得分回文中心为1和2两种情况考虑,因此时间复杂度为O(n²)。而Manacher算法运用了动态规划+中心扩展法优化了上
2021-11-24 01:56:57 215
原创 LeetCode做题记录 05
二叉树的坡度点击这里查看原题题目描述给定一个二叉树,计算 整个树 的坡度 。一个树的 节点的坡度 定义即为,该节点左子树的节点之和和右子树节点之和的 差的绝对值 。如果没有左子树的话,左子树的节点之和为 0 ;没有右子树的话也是一样。空结点的坡度是 0 。整个树 的坡度就是其所有节点的坡度之和。分析既然我们要求所有节点的坡度,那么我们必定要遍历每一个节点,三种方法,前序中序后序,而我们发现,叶子结点的坡度必定为0,因此我们可以从叶子结点来出发,既然每一个结点的坡度都等于其左子树所有节点的和与
2021-11-20 17:38:18 156
原创 Mysql RR级别下如何解决幻读
快照读在RR级别下,Mysql是根据MVCC来解决快照读时发生的幻读现象,简单来说就是利用了版本链以及Read View来实现的,RR下每一次快照读都会产生Read View 因此只有一个数据模板从而避免幻读,关于MVCC的原理可以看我之前发过的文章:Mysql MVCC的原理当前读重点讲讲当前读是如何解决幻读问题的。当前读是经过加锁来解决幻读的问题的,我们先来聊聊加锁的机制。如果where子句里通过非索引项来查找数据,则会使用表锁。如果通过普通索引来查找数据,则会使用间隙锁。如果使用唯一
2021-11-20 15:50:33 2439 3
原创 Mysql的MVCC原理
我们知道,在Mysql的RC隔离级别下和RR隔离级别下MVCC才会生效,它的实现原理是靠undo log版本连以及Read View来实现的,下面我们来分析一下。快照读快照读很简单,其实就是普通的select,是一种非阻塞无锁操作。当前读读的是当前最新的数据,比如 select ···· for update,insert,update等都是当前读,是要加锁的。隐藏字段在每一行记录的后面其实会有两个隐藏字段DB_TRX_ID:保存在该行记录上执行insert语句或者update语句的当前事务I
2021-11-19 20:02:43 1133
原创 Mysql的各种索引
最近在各种文章上都看到了各种各样类型的索引,都快把我搞懵了,什么聚集索引,主键索引,聚簇索引等等,这里来整理一下主键索引顾名思义,就是在主键上建立的索引,InnoDB中,主键索引的数据都会存到索引树的叶子结点上,而其他索引的叶子结点存储的都是主键字段的值,因此主键索引也就是聚集索引也就是聚簇索引,因为数据都聚集在叶子节点上。唯一索引建立在唯一约束的字段上的索引,唯一索引既可以是主键索引也可以是普通索引。覆盖索引覆盖索引指的是要查询的数据列被所建的索引覆盖了,比如说现在有个表,主键是id,有nam
2021-11-19 14:18:36 916
原创 LeetCode做题记录 04
LRU缓存机制点击这里查看原题题目描述根据你所学的数据结构,设计一个LRUCache类,以capacity为容量,有put(int key,int value) 方法和 get(int key)方法,当容量已满,要把最久未使用的数据删掉再加入新的数据。并且要求put和get方法的时间复杂度为O(1)分析既然要求get()方法的时间复杂度为O(1)我们自然要想到hash表,只有hash表这种结构才能使得获取数据的时间复杂度为O(1),因此类里面一定有一个成员变量是HashMap,那么另一个问题又来了
2021-11-19 00:15:29 307
原创 Mysql的事务日志
Mysql的常见的事务日志有这么几个:redo log,undo log,bin log。undo log先讲讲undo log吧。我们都知道,mysql在执行事务时,是可以进行回滚操作的,那么这个回滚操作究竟是如何实现的呢?这是通过MVCC(Multi Version Concurrency Control,多版本并发控制)实现的,其实就是每行记录都有不同的版本,形成一条版本链,可以通过无锁的方式访问到不同版本的数据,而MVCC就是通过undo log实现的。简单理解,undo log就是记录了事
2021-11-18 14:06:21 261
原创 LeetCode做题记录 03
不同路径点击这里查看原题题目分析类似这种有多少条路径/多少种方法/多少XXX的题目,类似于策划类的算法题,一般都能用动态规划来解决,而动态规划最重要是写出其状态转移方程,我们回到题目,题目的入参是m和n,因此我们可以设定一个函数f(m,n),其表示以m为行数以n为列数的棋盘上,机器人从左上角出发每次只能向右走或者向下走一步,一共有f(m,n)种路径。假设棋盘是三行两列,即m=3,n=2,如果机器人是向下走,那么m就减一,相当于机器人从两行两列的棋盘的左上角出发,也就是f(2,2),假设机器人是向右
2021-11-17 15:49:10 203
原创 谈谈jdk1.8的HashMap 02
HashMap扩容机制前情回顾:谈谈jdk1.8的HashMap 01上次我们把put方法讲完了,有一个方法我没有细说,那就是resize()方法,这个方法我个人认为是HashMap最精华但是却最难理解的地方,接下来我们慢慢讲解。resize()方法resize()方法的作用就是扩容,如果我们调用了无参构造来生成一个HashMap的时候,只会把加载因子初始化了一下(0.75),之后等到我们调用了put方法之后才会进行Node数组的初始化。看看代码吧,解析已经写在了注释里://当第一次调用这个方法
2021-11-16 22:00:58 774
原创 LeetCode做题记录 02
反转链表点击这里查看原题思路其实整体思路很简单,用一个now变量记录当前遍历的节点,用一个prev变量记录当前节点的上一个节点,再用一个next变量记录now变量的下一个节点,就可以这样操作了:next节点先保存着now节点的下一个节点,然后把now节点的next指向prev达到反向的目的,最后把next赋值给now即可。代码public ListNode reverseList(ListNode head) { ListNode prev = null,now = head;
2021-11-16 12:04:52 440
原创 谈谈jdk1.8的HashMap 01
HashMapHashMap是我们开发过程中最常用的集合类,也是面试的重灾区,我个人也在学习中,若有错误请纠正。HashMap的结构HashMap的结构是数组+链表,我们存储的键值对,在HashMap中会被封装为一个Node内部类,而其存储单位就是Node,所以数组的类型是Node类型,而每一个Node都有一个next属性指向下一个Node,形成了一个单链表,如图所示:成员变量 (只列举我认识的)static final int DEFAULT_INITIAL_CAPACITY = 1 <
2021-11-15 19:58:20 912 1
原创 LeetCode做题记录 01
允许重复选择元素的组合点击这里查看原题思路一个组合问题,从最简单想到的办法出发 暴力解法暴力用一个for循环遍历数组每一个数,一直寻找符合条件的数加到集合中,代码就不贴了,很难写。改进一般来讲,改进暴力写法的方法可以用回溯+剪枝来避免一些不必要的遍历。代码如下:class Solution { //保存答案 private List<List<Integer>> ans = new ArrayList(); public List<L
2021-11-14 17:15:16 368
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人