随笔分类 - 数据结构与算法
视频:bobo老师,左神,b站
题库:LeetCode(top200),剑指Offer(3遍),左神课上所有例题,《程序员代码面试指南》
书籍:《大话数据结构》《编程之美》《编程珠玑》
摘要:一、前中后序递归 1. 前序递归( 时间复杂度O(n)、空间复杂度O(n) ) class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>()
阅读全文
摘要:一、认识布隆过滤器 场景:如果遇到网页黑名单系统、垃圾邮件过滤系统、爬虫的网站判重系统等题目,又看到系统容忍一定程度的失误率,但是对空间要求比较严格,那么大概率考布隆过滤器的知识。 一个布隆过滤器精确地代表一个集合,并可以精确判断一个元素是否在集合中。 到底有多精确取决于具体的设计,但完全正确是不可
阅读全文
摘要:一、理论 LRU是一种缓存淘汰策略,最近使用的认为是「有用的」,很久没使用过的数据认为是无用的,缓存满时就优先删除它们。 LRU- Least recently used(最近最少使用页面置换算法、按访问的时序来淘汰) LFU- Least frequently used(最近最不常用页面置换算法、
阅读全文
摘要:一、理论 并查集的定义: 并查集是一种树型的数据结构,用于处理一些不交集的合并和查询问题。一般用数组实现。 Find:确定元素属于哪一个子集,它可以被用来确定两个元素是否属于同一个子集。 Union:将两个子集合并成同一个集合。 并查集的优化: 优化1: 降低rank,提高查询效率。合并时要考虑ra
阅读全文
摘要:一、理论 递归问题 -> 重叠子问题、最优子结构 -> 记忆化搜索(自顶向下) -> 动态规划(记忆化 + 自底向上) 动态规划(Dynamic Programming),即动态递推(递归 + 记忆化 -> 递推)。动态规划问题的一般形式就是求最值。 1. 状态的定义:opt[n],dp[n],fi
阅读全文
摘要:一、理论 常用的位运算: X & 1 == 1 OR == 0 :判断奇偶 X = X & (X - 1) : 清零最低位的1 (常用来求二进制位有多少个1) X & -X : 得到最低位的1, -X就是按位取反末尾加1,。 例如X为10100,-X为01100 X & (1 << (n - 1))
阅读全文
摘要:一、理论 1. 基本结构 Trie树,即字典树或单词查找树。典型应用是用于统计和排序大量的字符串(不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。 优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。 2. 核心思想 空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效
阅读全文
摘要:一、理论 适用二分查找的条件:1. 单调递增或递减 ; 2. 存在上下界; 3.能够通过索引访问(数组) Tips:题目中看见 数组 + 有序,要第一时间想到 二分 !!! 【循环不变量】的设计:声明的 left 和 right 的意义不同,二分查找的边界就不同,因此需要理解 left 和 righ
阅读全文
摘要:一、理论 1)首先,使用回溯算法关键是,将问题转化为 【树形问题】。 2)回溯的关键点: for循环、 递归。 for循环的作用在于另寻它路,可以逐个选择当前节点下的所有可能往下走下去的分支路径。 递归可以实现一条路走到黑和回退一步,把递归放在for循环内部,那么for每一次的循环,都在给出一个路径
阅读全文
摘要:一、理论 BFS用到队列,只有非递归写法。 应用到树时,不需要标记该节点是否走过。而应用到图结构时,需要标记某个节点是否已被访问过。 DFS需要用栈,有递归和非递归写法,推荐使用递归写法。 二、典型例题 ①:二叉树层次遍历(LC102、剑指22.从上往下打印二叉树) 方法1:树的BFS,需要用队列。
阅读全文
摘要:一、理论 贪心(Greedy)算法:在对问题求解时,总是做出在当前看来是最好的选择。 由于贪心算法每一次操作都需要取最大值或最小值,所以通常需要对数组排序。 适用Greedy 的场景: 问题能够分成子问题来解决,子问题的最优解能递推到最终问题的最优解。 如果不能使用贪心算法,只需要举出反例即可。 贪
阅读全文
摘要:一、理论 二、典型例题 ☆☆①:快速幂->实现计算x的n次幂函数(LC50、剑指12.数值的整数次方)【字节面试】 思路:采用分治的思想,时间复杂度为O(logn) class Solution { public double myPow(double x, long n) { // 方法1:递归
阅读全文
摘要:一、理论 二分搜索树: 1. 每个节点的键值大于左孩子; 2. 每个节点的键值小于右孩子; 3. 以左右孩子为根的子树仍为二分搜索树。 对于二分搜索树,要求掌握 插入、 查找、 删除 基本操作,以及 查找最大值、最小值; 给定一个数据,寻找前驱和后继,以及上界和下界 某个元素的排名rank 寻找第k
阅读全文
摘要:一、理论 Hash冲突及解决:关键字不同的元素映射到同样地址时会产生hash冲突,解决方法有:开放定址法(探测序列)、再哈希法、链地址法。 HashMap、HashSet >哈希表的查找、插入、删除的平均复杂度为O(1), TreeMap、TreeSet >二叉搜索树的查找、插入、删除的平均复杂度为
阅读全文
摘要:一、实现机制 1. 堆Heap(Binary、Fibonacci) 对于堆的底层实现,要会白板编程。 2. 二叉搜索树(BST) 二、典型例题 ①:返回数据流中的第K大元素(LC703) class KthLargest { private int k; private PriorityQueue<
阅读全文
摘要:一、栈和队列的特点,使用场景 栈(Stack)是限定仅在表尾进行插入和删除操作的线性表,后进先出。 队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表,先进先出。 二、代码实现 对于队列,LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Qu
阅读全文
摘要:一、数组 查找:O(1) 插入、删除:O(n) 二、链表 应用场景:1. 频繁插入和删除,链表优于数组。 2. 不知道有多少个元素需要添加。 查找:O(n) 插入、删除:O(1) 三、问答题 数组和链表的区别以及应用场景;假如有5万个数,有序,需要查找某一个数,问需要使用数组还是链表? 四、典型例题
阅读全文
摘要:主要内容: 不分行从上到下打印二叉树 分行从上到下打印二叉树 分行从下到上打印二叉树 之字形打印二叉树 二叉树的右视图 1. 不分行从上到下打印二叉树 题目描述:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。 相关题目:剑指22;剑指18; 代码实现: import java.
阅读全文

浙公网安备 33010602011771号