- 数据结构与算法(python)
- chapter_2 二分法(Binary Search)
- chapter_3 二叉树与分治法(Binary Tree & Divide Conquer)
- chapter_4 宽度优先搜索(Breadth First Search)
- chapter_5 深度优先搜索(Depth First Search)
- chapter_6 链表与数组(Linked List & Array)
- chapter_7 两根指针(Two Pointers)
- chapter_8 数据结构(Data Structure)
- chapter_9 动态规划(Dynamic Programming)
- 二分查找
- 第一个错误的代码版本
- 在大数组中查找
- 寻找旋转排序数组中的最小值
- 搜索二维矩阵
- 搜索二维矩阵2
- 搜索区间
- 山脉序列中的最大值
- 寻找峰值
- 搜索旋转排序数组
- x的平方根
- 木材加工
- 书籍复印
- 两个整数相除
- 二叉树的前序遍历
- 二叉树的中序遍历
- 二叉树的后序遍历
- 二叉树的最大深度
- 二叉树的所有路径
- 最小子树
- 平衡二叉树
- 具有最大平均数的子树
- 将二叉树拆成链表
- Lowest_Common_Ancestor_of_a_Binary_Tree
- 二叉树最长连续序列
- 二叉树的路径和
- 二叉树的路径和2
- 验证二叉查找树
- 二叉查找树迭代器
- 前序遍历和中序遍历树构造二叉树
- 二叉树的最小深度
- Same_Tree
- 翻转二叉树
- 二叉树的层次遍历
- 二叉树的序列化和反序列化
- 将二叉树按照层级转化为链表
- 克隆图
- 搜索图中节点
- 拓扑排序
- 课程表
- 岛屿的个数
- 僵尸矩阵
- 骑士的最短路线
- 找无向图的连通块
- 单词接龙
- 子集
- 数字组合
- 数字组合2
- 分割回文串
- 全排列
- 全排列2
- n皇后问题
- 字符串解码
- 摊平嵌套的列表
- 用栈实现队列
- 直方图最大矩形覆盖
- 带最小值操作的栈
- 翻转链表
- 翻转链表2
- K组翻转链表
- 链表划分
- 合并两个排序链表
- 交换链表当中两个节点
- 重排链表
- 旋转链表
- 带环链表
- 带环链表2
- 最大子数组
- 子数组之和
- 最接近零的子数组和
- 整数排序2
- 合并排序数组
- 合并排序数组2
- 两个排序数组的中位数
- 买卖股票的最佳时机
- 买卖股票的最佳时机2
- 最长连续序列
- 移动零
- 去除重复元素
- 有效回文串
- 数组划分
- 无序数组K小元素
- 交错正负数
- 字符大小写排序
- 两数之和
- 两数之和_不同组成
- 三数之和
- 两数和_小于或等于目标值
- 最接近的三数之和
- 四数之和
- 两数和_差等于目标值
- 双队列实现栈
- 重哈希
- LRU缓存策略
- 乱序字符串
- 堆化
- 丑数2
- 最高频的k个单词
- 数字三角形
- 最小路径和
- 不同的路径
- 爬楼梯
- 跳跃游戏
- 跳跃游戏2
- 最长上升子序列
- 完美平方
- 最大整除子集
- 青蛙跳
- 单词拆分
- 分割回文串2
- 最长公共子序列
- 编辑距离
- 不同的子序列
- 交叉字符串
- 打劫房屋
数据结构与算法(python)
chapter_2 二分法(Binary Search)
第一境界(二分位置 之 OOXX)
第二境界(二分位置 之 Half half)
第三境界(二分答案)
chapter_3 二叉树与分治法(Binary Tree & Divide Conquer)
破枪式(碰到二叉树的问题,就想想整棵树在该问题上的结果 和左右儿子在该问题上的结果之间的联系是什么)
- 二叉树的最大深度
- 二叉树的所有路径
- 最小子树
- 平衡二叉树
- 具有最大平均数的子树
- 将二叉树拆成链表
- Lowest Common Ancestor of a Binary Tree
- 二叉树最长连续序列
- 二叉树的路径和
- 二叉树的路径和 II
- 验证二叉查找树
- 二叉查找树迭代器
- 前序遍历和中序遍历树构造二叉树
- 二叉树的最小深度
- Same Tree
- 翻转二叉树
chapter_4 宽度优先搜索(Breadth First Search)
什么时候应该用BFS?
图的遍历 Traversal in Graph (1. 层级遍历 Level Order Traversal; 2. 由点及面 Connected Component;3. 拓扑排序 Topological Sorting)
最短路径 Shortest Path in Simple Graph
(仅限简单图求最短路径,即图中每条边长度都是1,且没有方向)
二叉树上的宽度优先搜索(BFS in Binary Tree)
图上的宽度优先搜索(BFS in Graph)
矩阵中的宽度优先搜索(BFS in Matrix)
chapter_5 深度优先搜索(Depth First Search)
碰到让你找所有方案的题,一定是DFS
90%DFS的题,要么是排列,要么是组合
栈相关的问题
总结 Conclusion
什么时候用 DFS? 求所有方案时
怎么解决DFS? 不是排列就是组合
复杂度怎么算? O(答案个数 * 构造每个答案的时间复杂度)
非递归怎么办? 必“背”程序
chapter_6 链表与数组(Linked List & Array)
Linked List
未做(高频题):
Array
技巧一:用prefix_sum
技巧二:
- 最大子数组
- 子数组之和
- 最接近零的子数组和
- 整数排序 II(quick sort&merge sort)
- 合并排序数组
- 合并排序数组 II
- 两个排序数组的中位数
- 买卖股票的最佳时机
- 买卖股票的最佳时机 II
- 最长连续序列
chapter_7 两根指针(Two Pointers)
- 移动零
- 去除重复元素
- 有效回文串
- 数组划分
- 无序数组K小元素
- 交错正负数
- 字符大小写排序
- 两数之和
- 两数之和 - 不同组成
- 三数之和
- 两数和-小于或等于目标值
- 最接近的三数之和
- 四数之和
- 两数和 - 差等于目标值
chapter_8 数据结构(Data Structure)
独孤九剑 —— 破箭式
BFS的主要数据结构是Queue
DFS的主要数据结构是Stack
千万不要搞反了!很体现基础知识的扎实度!
chapter_9 动态规划(Dynamic Programming)
通过一道经典题理解动态规划
1、递归与动规的联系与区别
2、记忆化搜索
什么情况下使用动态规划
1、求最大值最小值
2、判断是否可行
3、统计方案个数
独孤九剑 - 破气式
初始化一个二维的动态规划时就去初始化第0行和第0列
接龙型动态规划
属于”坐标型”动态规划的一种
字符型动态规划
一般有N个字符,就开N+1个位置的数组;第0个位置单独流出来作初始化
二分查找
1 |
|
第一个错误的代码版本
1 |
|
在大数组中查找
1 |
|
寻找旋转排序数组中的最小值
1 |
|
搜索二维矩阵
1 |
|
搜索二维矩阵2
1 |
|
搜索区间
搜索区间
思路:先搜索target最左边的值,然后再把这个值赋给start重新搜索最右边的值
1 |
|
山脉序列中的最大值
山脉序列中的最大值
时间复杂度O(n)
1 |
|
时间复杂度O(logn)
1 |
|
寻找峰值
1 |
|
搜索旋转排序数组
1 |
|
x的平方根
1 |
|
木材加工
1 |
|
书籍复印
书籍复印
一句话描述题意:将数组切分为k个子数组,让数组和最大的最小
1 |
|
1 |
|
两个整数相除
1 |
|
二叉树的前序遍历
1 |
|
二叉树的中序遍历
1 |
|
二叉树的后序遍历
1 |
|
二叉树的最大深度
1 |
|
二叉树的所有路径
1 |
|
最小子树
1 |
|
平衡二叉树
1 |
|
具有最大平均数的子树
1 |
|
将二叉树拆成链表
1 |
|
Lowest_Common_Ancestor_of_a_Binary_Tree
Lowest Common Ancestor of a Binary Tree
1 |
|
二叉树最长连续序列
1 |
|
二叉树的路径和
1 |
|
二叉树的路径和2
1 |
|
验证二叉查找树
1 |
|
二叉查找树迭代器
1 |
|
前序遍历和中序遍历树构造二叉树
1 |
|
二叉树的最小深度
1 |
|
Same_Tree
1 |
|
翻转二叉树
1 |
|
二叉树的层次遍历
1 |
|
二叉树的序列化和反序列化
1 |
|
将二叉树按照层级转化为链表
1 |
|
克隆图
1 |
|
搜索图中节点
1 |
|
拓扑排序
1 |
|
课程表
1 |
|
岛屿的个数
1 |
|
僵尸矩阵
1 |
|
骑士的最短路线
1 |
|
找无向图的连通块
1 |
|
单词接龙
1 |
|
子集
1 |
|
数字组合
1 |
|
数字组合2
1 |
|
分割回文串
1 |
|
全排列
1 |
|
全排列2
1 |
|
n皇后问题
1 |
|
字符串解码
1 |
|
摊平嵌套的列表
摊平嵌套的列表(直接摊平,和题目无关)
1 |
|
用栈实现队列
1 |
|
直方图最大矩形覆盖
1 |
|
1 |
|
带最小值操作的栈
1 |
|
翻转链表
1 |
|
翻转链表2
1 |
|
K组翻转链表
1 |
|
链表划分
1 |
|
合并两个排序链表
1 |
|
交换链表当中两个节点
1 |
|
重排链表
1 |
|
旋转链表
1 |
|
带环链表
1 |
|
带环链表2
1 |
|
最大子数组
1 |
|
子数组之和
1 |
|
最接近零的子数组和
1 |
|
整数排序2
1 |
|
1 |
|
合并排序数组
1 |
|
合并排序数组2
1 |
|
两个排序数组的中位数
1 |
|
买卖股票的最佳时机
1 |
|
买卖股票的最佳时机2
1 |
|
最长连续序列
1 |
|
移动零
1 |
|
去除重复元素
1 |
|
有效回文串
1 |
|
数组划分
1 |
|
无序数组K小元素
1 |
|
交错正负数
1 |
|
字符大小写排序
1 |
|
两数之和
1 |
|
两数之和_不同组成
1 |
|
三数之和
1 |
|
两数和_小于或等于目标值
1 |
|
最接近的三数之和
1 |
|
四数之和
1 |
|
两数和_差等于目标值
1 |
|
双队列实现栈
1 |
|
重哈希
1 |
|
LRU缓存策略
1 |
|
乱序字符串
1 |
|
堆化
堆化 Heapify
对于每个元素A[i],比较A[i]和它的父亲结点的大小,如果小于父亲结点,则与父亲结点交换。
交换后再和新的父亲比较,重复上述操作,直至该点的值大于父亲。
对于每个元素都要遍历一遍,这部分是 O(n)。每处理一个元素时,最多需要向根部方向交换 logn 次。因此总的时间复杂度是 O(nlogn)。
1 |
|
丑数2
1 |
|
最高频的k个单词
1 |
|
数字三角形
递归和动规入门题及提升
数字三角形
解决方法一:DFS: Traverse
1 |
|
解决方法二:DFS: Divide Conquer
1 |
|
解决方法三:Divide Conquer + Memorization
1 |
|
解决方法四:Traditional Dynamic Programming
1 |
|
最小路径和
1 |
|
不同的路径
1 |
|
爬楼梯
1 |
|
跳跃游戏
1 |
|
跳跃游戏2
1 |
|
最长上升子序列
1 |
|
完美平方
1 |
|
最大整除子集
1 |
|
青蛙跳
1 |
|
单词拆分
1 |
|
分割回文串2
1 |
|
1 |
|
最长公共子序列
1 |
|
编辑距离
1 |
|
不同的子序列
1 |
|
交叉字符串
1 |
|
打劫房屋
1 |
|