摘要:【参考链接】 530. 二叉搜索树的最小绝对差 【注意】 1.二叉搜索树采用中序遍历,其实就是一个有序数组。 2.使用双指针,更快。 【代码】 1 # Definition for a binary tree node. 2 # class TreeNode(object): 3 # def __i
阅读全文
摘要:【参考链接】 654. 最大二叉树 【注意】 1.构造二叉树,都需要用前序遍历。 2.二叉树的根是数组中的最大元素。 3.没必要构造新数组,通过下标控制左右区间。运行效率会高很多。 【代码】 1 # Definition for a binary tree node. 2 # class TreeN
阅读全文
摘要:【参考链接】 513. 找树左下角的值 【注意】 1.用递归的话就就一直向左遍历,但是到最后一个,它未必是最后一行。是要找到树的最后一行的最左边的值。(不一定是指是左孩子) 2.如果使用递归法,如何判断是最后一行呢,其实就是深度最大的叶子节点一定是最后一行。 3.只要是优先遍历左都可以,所以前中后序
阅读全文
摘要:【参考链接】 110. 平衡二叉树 【注意】 1.一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 2.求高度一定要用后序遍历。 【代码】 1 # Definition for a binary tree node. 2 # class TreeNode(obj
阅读全文
摘要:【参考链接】 104. 二叉树的最大深度 【注意】 1. 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)。 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)。 2.根节点的高度就是二叉树的
阅读全文
摘要:【参考链接】 102. 二叉树的层序遍历 【注意】 1.队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。而这种层序遍历方式就是图论中的广度优先遍历,只不过我们应用在二叉树上。 2.遍历的时候要记录队列的大小。就可以知道哪些元素是第几层的。 3.记得首先要判断
阅读全文
摘要:【参考链接】 1.满二叉树,完全二叉树,二叉搜索树(有数值,有序树)。 2.平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 3.优先级队列其实是一个堆
阅读全文
摘要:【参考链接】 239. 滑动窗口最大值 【注意】 1.使用单调队列的经典题目。 2.大顶堆每次只能弹出最大值,无法移除其他数值,造成大顶堆维护的不是滑动窗口里面的数值了。所以不能用大顶堆。 3.需要一个队列,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大
阅读全文
摘要:【参考链接】 20. 有效的括号 【注意】 1.括号匹配是使用栈解决的经典问题。 2.这个命令最后进入a目录,系统是如何知道进入了a目录呢 ,这就是栈的应用(其实可以出一道相应的面试题了)。 3.有三种不匹配的情况,第一种情况,字符串里左方向的括号多余了 ;第二种情况,括号没有多余,但是 括号的类型
阅读全文
摘要:【参考链接】 1.栈提供push 和 pop 等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。 不像是set 或者map 提供迭代器iterator来遍历所有元素。 2.栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说
阅读全文
摘要:【参考链接】 28. 找出字符串中第一个匹配项的下标 【注意】 1.kmp解决的就是字符串匹配的问题。 2.kmp如何知道匹配过哪些字符串,并跳到匹配过的内容后面的字符。 前缀表 3.找到一个子字符串里它的最长相等前后缀。 4.前缀是包含首字母,不包含尾字母的所有子串;后缀只包含尾字母,不包含首字母
阅读全文
摘要:【参考链接】 344. 反转字符串 【注意】 1.双指针法,原地进行操作。 2.字符串也是一种数组,所以元素在内存中是连续分布。 【代码】 return s.reverse() 1 class Solution(object): 2 def reverseString(self, s): 3 """
阅读全文
摘要:【参考链接】 454. 四数相加 II 【注意】 1.a+b作为key,出现次数作为value,0-(c+d)有没有在map集合里出现过,出现的次数做统计。遍历两个数组时间复杂度为O(n2)。 【代码】 1 class Solution(object): 2 def fourSumCount(sel
阅读全文
摘要:【知识点】 1.当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。 2.哈希法也是牺牲了空间换取了时间,因为要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。 3.三种常用数据结构:数组,set,map 参考链接 242. 有效的字母异位词 【注意】 1.在has
阅读全文
摘要:24. 两两交换链表中的节点 【注意】 1.操作指针一定要指向要反转两个结点的前一个结点 2.遍历链表的时候什么时候终止,cur.next.next == None ,则遍历结束(n为奇数),cur.next == None(n为偶数)。 3.时间复杂度O(n),空间复杂度O(1) 【代码】 1 #
阅读全文
摘要:一.链表基础 1.最后一个节点的指针域指向null(空指针的意思)。 2.链表在内存中不是连续分布的。 3.链表的长度可以是不固定的,并且可以动态增删, 适合数据量不固定,频繁增删,较少查询的场景。 1 #链表节点的定义 2 class ListNode: 3 def __init__(self,
阅读全文
摘要:977. 有序数组的平方 【不足】 1.双指针没掌握到精髓:left = 0, right = len(nums) -1 (不是 right = 0 ) 【参考资料】 代码随想录 【代码】 1 class Solution(object): 2 def sortedSquares(self, num
阅读全文
摘要:704-二分查找 讲解链接 【要点】 1.使用二分法的前提:数组要有序,且无重复元素 2.算法复杂度: 时间复杂度:O(log n) 空间复杂度:O(1) 【注意】 1.在二分法后续处理中可能会导致middle的范围超过 int 的数据范围。见如下, 1 int middle = left + ((
阅读全文