480页数据结构和算法手册(附200道大厂真题)
数据结构和算法的重要性不需要过多强调了,可以说是大厂面试的标配。对于一个算法牛人,即便计算机基础差点,大厂也更愿意要。 算法厉害说明他数学建模能力强,逻辑思维强,有了过硬的底层能力,其他计算机相关的知识只要肯学就不是问题。
另外,算法不光用在面试上,工作里也是能用到的,比如做导航规划,用最短路径算法肯定比遍历的方式更快。
我们都知道,程序 = 数据结构 + 算法 数据结构是数据的组织形式,而算法是建立在数据结构基础之上的解决问题的方式。 因为有了有序数组,我们可以在此之上提出二分查找加快查询速度;因为有了图型结构,我们可以在此之上提出最短路径算法加快路径搜索。
所以说,数据结构和算法 这部分核心要学的就是学习各种各样的数据结构,以及在此数据结构之上衍生出来的各种算法。从而在工作中 能够高效得解决问题。
我搜集数据结构和算法的优质资料整理成册,内容包括算法原理、代码实现、LeetCode实战和200道大厂面试真题。共 480 页 pdf,想学习算法的朋友可以访问 GitHub 项目下载。480页数据结构和算法手册。
下面介绍下手册的内容,以链接为主。(注: pdf内容都是正文,没有链接)
算法性能分析
数据结构
数组
数组算是最常见的一种数据结构,按照维度可以分为:一维数组、二维数组、...、n维数组,在实际使用中, 主要以一维数组和二位数组为主。
一维数组上常见的算法有排序和查找,二维数组上常见的算法有动态规划。
排序
-
LeetCode 实战
-
大厂面试真题
二分查找
-
二分查找变体 : 寻找左右边界
-
LeetCode 实战
- 二分查找 / 题解 / 难度:简单
- 在排序数组中查找元素的第一个和最后一个位置 / 题解 / 难度:中等
- 寻找两个正序数组的中位数 / 题解 / 难度:困难
- 寻找旋转排序数组中的最小值 II / 题解 / 难度:困难
-
大厂面试真题
动态规划
动态规划的核心思想是将求解原问题的最优解转化为求解子问题的最优解。在实际求解过程中,先计算子问题的最优解,并将其保存在数据组中, 子问题求解完后,原问题自然就解决了。解决动态规划问题的数据结构有数组、树和图,其中二维数组最为常见。
-
动态规划-斐波那契数列 : 以一维数组了解动态规划原理,最简单、最适合入门的例子
-
详解动态规划 : 动态规划解题思路,及各类问题的详细求解过程
-
动态规划实战 :经典动态规划问题实战
-
LeetCode 实战
-
大厂面试真题
链表
数组这种数据结构适合查找,查找第 i 个元素,根据下表 a[i] 可以直接查到,但不适合插入和差删除 ,因为需要移动大量数据。
而链表正好相反,适合插入和删除,更改指针的指向即可,无需移动数据,而查找效率比数组慢,查找第 i 个元素,只能 从表头开始,一个个向下查找。
-
数据结构与算法-链表 单链表实现:Python版 Java版 JavaScript版 PHP版 C++版
-
LeetCode 实战
-
链表增删改查
- 链表的中间结点 / 题解 / 难度:简单
- 删除链表中的节点 / 题解 / 难度:简单
- 删除排序链表中的重复元素 / 题解 / 难度:简单
- 删除排序链表中的重复元素 II / 题解 / 难度:中等
- 删除链表的倒数第 N 个结点 / 题解 / 难度:中等
-
反转链表
-
多链表合并
-
判断链表是否有环
-
判断链表相交
-
双向链表
-
循环链表
-
-
大厂面试真题
栈和队列
栈和队列也是两种相对应的数据结构,栈中的元素是先进后出,队列中的元素是先进先出。 这两种数据结构能够解决不少实际问题,同时跟其他数据结构结合也能发挥更大的作用。
队列会有一些变种,如:优先队列、循环队列、双端队列等。
-
代码实现
-
LeetCode 实战
-
大厂面试真题
-
栈
-
队列
-
散列表
树
树形结构广泛应用于排序、查找算法中,根据树杈的个数分为二叉树、多叉树(如:B树),在 数据结构和算法
中我们主要学习的是二叉树。
二叉树
-
基础知识
-
LeetCode 实战
-
大厂面试真题
- 【2021届阅文Java方向笔试卷】 二叉树的最近公共祖先
- 【金山办公2020校招计算机视觉算法工程师笔试题(二)】 二叉树高度
- 【金山办公2020校招自然语言处理NLP工程师笔试题(一)】 二叉树高度
- 【金山办公2020校招大数据和机器学习算法笔试题(二)】 二叉树
- 【金山办公2020校招大数据和机器学习算法笔试题(二)】 二叉树性质
- 【金山办公2020校招大数据和机器学习算法笔试题(一)】 中序遍历
- 【金山办公2020校招iOS开发工程师笔试题(二)】 遍历二叉树
- 【金山办公2020校招iOS开发工程师笔试题(一)】 遍历二叉树
- 【小米2019秋招系统软件开发笔试题(B)】 完全二叉树性质
- 查看全部题目
二叉查找树
二叉排序树中的元素是有序的,并且天然地实现了二分查找算法。但缺点是树有可能不平衡, 极端情况下,一棵只有左子树或者右子树的二叉查找树,查询的时间复杂度退化为 O(n)。
-
LeetCode 实战
- 二叉搜索树中的搜索 / 题解 / 难度:简单
- 验证二叉搜索树 / 题解 / 难度:中等
- 二叉搜索树中的插入操作 / 题解 / 难度:中等
- 删除二叉搜索树中的节点 / 题解 / 难度:中等
- 二叉搜索树中第K小的元素 / 题解 / 难度:中等
- 把二叉搜索树转换为累加树 / 题解 / 难度:中等
- 把二叉搜索树转换为累加树 / 题解 / 难度:中等
- 不同的二叉搜索树 / 题解 / 难度:中等
- 不同的二叉搜索树 II / 题解 / 难度:中等
-
大厂面试真题
平衡二叉树
由于二叉查找树存在不平衡的情况,导致查找的时间复杂度退化为 O(n),因此需要采用一定的算法将二叉查找树保持平衡。
-
代码实现
- AVL树 Python版 Java版 JavaScript版 C++版
- 红黑树 Python版 Java版 JavaScript版 C版
-
LeetCode 实战
-
大厂面试真题
图
图算是比较复杂的数据结构了,而且实际应用多。生活中随处可见图结构,如:互联网、城市和道路等。 也正是因为图在生活中非常常见,所以在图上会产生比较多的算法。
最小生成树
一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。 最小生成树有许多重要的应用,如:要在n个城市之间铺设光缆,使得铺设光缆的总费用最低。
最短路算法
最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。
拓扑排序
将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。
LeetCode 实战
-
最小生成树
- 最低成本联通所有城市 / 题解 / 难度:中等
- 连接所有点的最小费用 / 题解 / 难度:中等
- 水资源分配优化 / 题解 / 难度:困难
-
最短路算法
- 网络延迟时间 / 题解 / 难度:中等
- 使网格图至少有一条有效路径的最小代价 / 题解 / 难度:困难
-
拓扑排序
- 课程表 / 题解 / 难度:中等
- 课程表 II / 题解 / 难度:中等
- 矩阵中的最长递增路径 / 题解 方法二:拓扑排序 / 难度:困难
大厂面试真题
-
深度优先遍历
-
广度优先遍历
-
最小生成树
-
最短路算法
-
拓扑排序
算法
回溯
回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。
-
LeetCode 实战
分治
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。
-
LeetCode 实战
- 多数元素 / 题解 方法四:分治 / 难度:简单
- 颠倒二进制位 / 题解 方法二:位运算分治 / 难度:简单
- 数组中的逆序对 / 题解 / 难度:困难
- 寻找两个正序数组的中位数 / 题解 / 难度:困难
-
大厂面试真题
贪心
-
LeetCode 实战
-
大厂面试真题
动态规划
见“数据结构-数组-动态规划”部分
排序
见“数据结构-数组-排序”部分
欢迎公众号 「渡码」,输出优质编程内容。