文章目录
代码随想录个人学习记录
2021/7/14(leetcode)
- 在排序数组中查找元素的第一个和最后一个位置(34)【二分查找,分别查找左右边界】
- 有效的完全平方数(367)【二分查找】
- 比较含退格的字符串(844)【逆序双指针】
- 有序数组的平方(977)【双指针】
- 长度最小的子数组(209)【滑动窗口(双指针)】
- 水果成篮(904)【滑动窗口】
- 最小覆盖子串(76)【滑动窗口,困难】
- 螺旋矩阵 II(59)【设置上下左右边界】
- 螺旋矩阵(54)【设置上下左右边界,更容易理解】
2021/7/15(leetcode)
-
移除链表元素(203)
-
设计链表(707)
-
删除链表的倒数第 N 个结点(19)【尝试使用虚拟节点】
-
环形链表 II(142)【数学推导】
-
环形链表(141)【数学推导】
===============================
-
有效的字母异位词(242)【额外数组】
-
赎金信(383)【和上题一样的思路】
-
字母异位词分组(49)【字母异位词排序后的结果是一样的】
-
两个数组的交集(349)【容器可以使用别的容器的迭代器进行初始化】
================================
-
找到字符串中所有字母异位词(438)【滑动窗口,按照模板写】
-
字符串的排列(567)【滑动窗口,按照模板写】
================================
-
两个数组的交集 (349)【hashset】
-
两个数组的交集 II(350)【hashmap】
-
四数相加 II(454)【hashmap】
-
两数之和(1)【hashset】
================================
-
三数之和(15)【双指针,去重,剪枝】
-
四树之和(18)【双指针,去重,剪枝】
2021/7/17【字符串】
- 反转字符串(344)
- 反转字符串II(541)
- 替换空格(5)【注意遍历时的边界判断】
- 翻转字符串里的单词(151)【整体反转 + 去除空格(双指针,考虑前后空格) + 部分反转】
- 左旋转字符串(剑指58)
2021/7/18【字符串】
- 实现 strStr()(28)【KMP算法】
时间复杂度分析:
1. 遍历过程O(n):虽然在匹配失败的时候,next指针会回退,
但回退的次数跟之前匹配成功的次数相关(也就是查找数组指针右移的次数),
而数组指针右移的次数不会超过n,所以回退的次数最多也就是n,总次数2n;
2. 构造next过程O(m):如上,总次数2m。
【最坏情况例子:aaaabaaaac 寻找串:aaaaa】
在b匹配失败时,要回退3次
总共O(n + m)
2021/7/19【KMP算法】
- 重复的子字符串(459)【用到KMP算法】
/*
理论:数组长度len -(next[len-1] + 1)就会得到最小的周期长度l(l != len,等于说明没有重复子串),
如果len = n*l,则说明题目为true
*/
2021/7/20【双指针】
- 删除有序数组中的重复项(26)
- 移动零(283)
- 比较含退格的字符串(844)【!!!每个字符串回退到真正需要比较的字符】
- 有序数组的平方(977)【必须使用额外数组】
- 三数之和/四数之和(15/18)
【1. 先排序 2. 剪枝:要注意target为任意值的判断条件 3. 双指针 4. 去重】
2021/7/21【栈 / 队列】
基础理论:栈和队列都是容器适配器,底层可以使用不同容器实现(默认使用deque),所以元素在内存中的数据分布取决于底层容器。
- 用队列实现栈(225)【实际只需要一个队列就可以实现】
- 有效的括号(20)
- 删除字符串中的所有相邻重复项(1047)
- 逆波兰表达式求值(150)
2021/7/22【栈 / 队列】
- 滑动窗口最大值(239)
- 前 K 个高频元素(347)【排序使用包含k个的小顶堆,优化时间复杂度至O(nlogk),注意堆的构造写法(包含容器和比较方式)】
2021/7/23【二叉树】
基础理论:数节点的代码编写;深度优先遍历(利用栈,无论是递归还是迭代),广度优先遍历(利用队列)
- 前序遍历(144)【注意迭代版的插入节点顺序】
- 中序遍历(94)【和其他两个不同】
- 后序遍历(145)【可通过修改前序遍历,最后反转结果得到】
2021/7/24【二叉树】
层次遍历
- 二叉树的层序遍历(102)
- 二叉树的层序遍历 II(107)
- 二叉树的右视图(199)
- 二叉树的层平均值(637)
- N 叉树的层序遍历(429)
- 在每个树行中找最大值(515)
- 填充每个节点的下一个右侧节点指针(116)
- 填充每个节点的下一个右侧节点指针 II(117)【普通二叉树,对于层次遍历没有区别】
- 二叉树的最大深度(104)【迭代法】
- 二叉树的最小深度(111)【迭代法,递归法也要注意】
2021/7/25【二叉树】
- 翻转二叉树(226)
- N 叉树的前序遍历(589)
- N 叉树的后序遍历(590)