142. 环形链表 II
思路:快慢指针,快指针每次走2步,二者相遇后,快指针每次走1步,再次相遇的时候,就是入口节点
152. 乘积最大子数组
思路:递推,针对于当前i来说,f[i]有2种情况,取当前a[i],或者是连接起来a[i] * f[i - 1],因为会出现负数的情况,所以再搞一个g[i]来表示最小值(f[i]表示最大值)
- 时间复杂度:O(n)
- 空间复杂度:O(1)
146. LRU 缓存机制
思路:建立一个双向链表结构体Node,结构体中包含key-val,left, right指针。访问一个元素的时候通过hash表来访问,insert()对应的是头插法,remove()则是简单的删除节点。初始化两个边界节点L, R,初始的时候只有L和R
- 时间复杂度:O(1),因为用到了哈希表
208. 实现 Trie (前缀树)
思路:建立Trie的过程中,首先需要一个Node类,其中这个节点存储的是
_isword
和_next(26)
数组,然后就是模板
42. 接雨水
思路:阶梯思想,对于当前的h[i],找到比它矮的柱子,last是它左边第1个柱子,h[stk.top()]是它左边第2个柱子,这样才能存下雨水;对于比h[i]高的,则是h[i] - last,此时last是第一个比h[i]高的柱子的左边第一个柱子
5. 最长回文子串
思路:遍历字符串s,对于每一个字符下标i,考虑从i往左右扩展,当出现
s[l] != s[r]
的时候,那么回文串就是(l + 1, r - 1)
这个区间,求这里的长度即可;还要注意有奇数
和偶数
两种情况
96. 不同的二叉搜索树
思路:递推,问的是从
1..n
为节点的BST有多少种,我们从1
递推到n
,每一次递推,都是以1为左边界,i为右边界,其中j为根节点,那么左子树的节点数为((j - 1) - 1) + 1
,右子树的节点数为(i - (j + 1)) + 1
,最后递推到f[n]
即可;
注:因为是BST,所以每个子树
都会是连续的一段
538. 把二叉搜索树转换为累加树
思路:BST就意味着
中序遍历
——左根右
,但是这道题是求的后缀和,因此我们可以换成右根左
,最后求的是一棵树,所以本质上要改变的是这棵树上每个节点的值,所以,取出当前节点值
,然后给当前节点增加其后缀和
,然后更新最新后缀和
543. 二叉树的直径
思路:
dfs(root)
这个函数的本质,就是求以root为根节点到叶子节点的最远距离,最大直径在dfs
过程中不断更新,每次dfs的返回值则是max(左子树高度,右子树高度) + 1
94. 二叉树的中序遍历
思路:这题没啥说的,
压栈
写法直接背死就可以了
这种记录还不错