leetcode 题解,记录自己的 leetcode 解题之路。
本仓库目前分为四个部分:
- 第一个部分是 算法刷题技巧和一些算法模板,掌握一些接替模板,可以快速帮助我们理解一个问题的接替方法。
- 第二部分是对于数据结构与算法的总结
- 第三部分是对刷过的提机型汇总。
- 第四部分是计划, 这里会记录将来要加入到以上三个部分内容
- 时间复杂度
- 空间复杂度
- 线性表
- 列表(必学)
- 链表(必学)
- 跳跃表(知道原理理,应⽤用,最后⾃自⼰己实现⼀一遍)
- 并查集(建议结合刷题学习)
不⽤用说,链表、列列表必须,不不过重点是链表。
- 栈(必学)
- 队列(必学)
- 优先队列、堆(必学)
- 多级反馈队列(原理理与应⽤用)
特别是优先队列,再刷题的时候,还是经常⽤用到的,队列列与栈,是最基本的数据结构,必学。可以通过博客来学习
- 碰撞解决⽅方法:开放定址法、链地址法、再次哈希法、建⽴立公共溢出区(必学)
- 布隆隆过滤器器(原理理与应用)
- 二叉树:各种遍历(递归与⾮递归)(必学)
- 哈夫曼树与编码(原理理与应用)
- AVL树(必学)
- B 树与 B+ 树(原理理与应用)
- 前缀树(原理理与应用)
- 红⿊黑树(原理理与应用)
- 线段树(原理理与应用)
- 堆:最大堆 / 最小堆
- 树与图:最近公共祖先、并查集
- 字符串:前缀树(字典树) / 后缀树
树相关是知识还是挺多的,建议看书,可以看《算法第四版》。
- 矩阵(必学)
- 简单排序:插入排序、选择排序、冒泡排序(必学)
- 分治排序:快速排序、归并排序(必学,快速排序还要关注中轴的选取⽅方式)
- 分配排序:桶排序、基数排序
- 树状排序:堆排序(必学)
- 其他:计数排序(必学)、希尔排序
- 图的表示:邻接矩阵和邻接表
- 遍历算法:深度搜索和⼴广度搜索(必学)
- 最短路路径算法:Floyd,Dijkstra(必学)
- 最小⽣生成树算法:Prim,Kruskal(必学)
- 实际常⽤用算法:关键路路径、拓扑排序(原理与应用)
- ⼆分图匹配:配对、匈⽛牙利利算法(原理与应用)
- 拓展:中心性算法、社区发现算法(原理与应用)
- 回溯算法
- 递归算法
- 深度优先遍历(DFS)
- 广度优先遍历(BFS)
- 二叉搜索树
- 树形DP:01背包问题
- 线性DP:最长公共子序列列、最长公共⼦子串
- 区间DP:矩阵最大值(和以及积)
- 数位DP:数字游戏
- 状态压缩DP:旅行商
- 正则表达式
- 模式匹配:KMP、Boyer-Moore
- 双指针
- 二分查找
- 滑动窗口
- 分治算法
- 贪心算法
- 前缀匹配树
在这一部分,我将会更新一些常用的算法技巧,掌握一些算法技巧不是偷懒,而是为了更好的刷题,更高效的去解答每一道题目,可以帮助我们迅速的去定位一些问题的解法,常用的一些技巧,比如:双指针,二分查找,滑动窗口,递归等等,并且还会借鉴网上的一些模板,形成自己的一套接替思路,希望可以帮到大家。
注:本人在学习算法阶段,笔记是参考博主
labuladong
,还是非常感谢这位大神的方法和技巧,让我受益匪浅,下面的笔记是参考这位博主的,加了一些自己的观点和代码补充。
涉及数组,字符串,链表,树,栈和队列等数据结构,这一部分主要是熟悉java语言中的各种集合的实现和方法,理解每一种数据结构的优点和缺点,使用情景等。
数组:使用连续的内存,可以根据下表在o(1)时间内读取和写入任何元素,效率很高,但是在插入一个元素的时候,效率就很低。数组可以用来实现哈希表,把数组的下表作为哈希表的键值key,而元素就代表哈希表的值。
- 剑指 Offer 03. 数组中重复的数字
- 剑指 Offer 04. 二维数组中的查找
- 剑指 Offer 05. 替换空格
- 剑指 Offer 06. 从尾到头打印链表
- 剑指 Offer 07. 重建二叉树
- 剑指offer面试题8:二叉树的下一个节点
- 剑指 Offer 09. 用两个栈实现队列
如果我们在程序中需要重复的多次计算相同的问题,那么通常可以使用递归或者循环,但是往往递归算法的效率不如循环。
- 顺序查找:元素无序时查找
- 二分查找:相对有序的数组中查找
- 哈希查找:o(1)时间内查找元素
- 二叉排序树:一种特殊的树结构
- 高质量代码
- 剑指 Offer 16. 数值的整数次方
- 剑指 Offer 17. 打印从1到最大的n位数
- 剑指 Offer 18. 删除链表的节点
- 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
健壮性就是需要我们考虑不合法的输入,针对不合法的输入需要给出反馈,比如空指针,空字符串,索引越界怎么办。
- 剑指 Offer 22. 链表中倒数第k个节点
- 剑指 Offer 22. 合并两个有序链表
- 剑指 Offer 22. 合并k个有序链表
- 剑指 Offer 22. 判断量表中是否包含环
- 剑指 Offer 22. 判断两个链表是否相交
- 剑指 Offer 23. 链表中环的入口节点
- 剑指 Offer 24. 反转链表
- 剑指 Offer 25. 合并两个排序的链表
- 剑指 Offer 26. 树的子结构
- 剑指 Offer 27. 二叉树的镜像
- 剑指 Offer 28. 对称的二叉树
- 剑指 Offer 30. 包含min函数的栈
- 剑指 Offer 31. 栈的压入、弹出序列
- 剑指 Offer 32 - I. 从上到下打印二叉树
- 剑指 Offer 32 - II. 从上到下打印二叉树 II
- 剑指 Offer 32 - III. 从上到下打印二叉树 III
- 剑指 Offer 33. 二叉搜索树的后序遍历序列
- 剑指 Offer 34. 二叉树中和为某一值的路径
- 剑指 Offer 35. 复杂链表的复制
- 剑指 Offer 36. 二叉搜索树与双向链表
- 剑指 Offer 37. 序列化二叉树
- 剑指 Offer 38. 字符串的排列
- 剑指 Offer 39. 数组中出现次数超过一半的数字
- 剑指 Offer 40. 最小的k个数
- 剑指 Offer 40. 最小的k个数1
- Top问题解决方案
- 剑指 Offer 42. 连续子数组的最大和
- 剑指 Offer 45. 把数组排成最小的数
- 剑指 Offer 46. 把数字翻译成字符串
- 剑指 Offer 47. 礼物的最大价值
- 剑指 Offer 48. 最长不含重复字符的子字符串
- 剑指 Offer 49. 丑数
- 剑指 Offer 50. 第一个只出现一次的字符
- 剑指 Offer 51. 数组中的逆序对
- 剑指 Offer 52. 两个链表的第一个公共节点
- 剑指 Offer 56 - I. 数组中数字出现的次数
- 剑指 Offer 56 - I. 数组中数字出现的次数
- 剑指 Offer 53 - I. 在排序数组中查找数字 I
- 剑指 Offer 53 - II. 0~n-1中缺失的数字
- 剑指 Offer 54. 二叉搜索树的第k大节点
- 剑指 Offer 55 - I. 二叉树的深度
- 剑指 Offer 55 - II. 平衡二叉树
- 剑指 Offer 56 - I. 数组中数字出现的次数
- 剑指 Offer 57. 和为s的两个数字
- 剑指 Offer 57 - II. 和为s的连续正数序列
- 剑指 Offer 58 - I. 翻转单词顺序
- 剑指 Offer 58 - II. 左旋转字符串
- 剑指 Offer 59 - I. 滑动窗口的最大值
- 剑指 Offer 59 - II. 队列的最大值
- 剑指 Offer 61. 扑克牌中的顺子
- 剑指 Offer 62. 圆圈中最后剩下的数字
- 判断链表是否包含环
- 两数相加
- 1. 两数之和
- 无重复字符的最长子串
- 6.最长回文子串
- 7. 整数反转
- 8. 字符串转换整数 (atoi)
- 9. 回文数
- 11.盛最多水的容器
- 12. 整数转罗马数字
- 13. 罗马数字转整数
- 14. 最长公共前缀
- 15. 三数之和
- 16. 最接近的三数之和
- 7. 电话号码的字母组合
- 19. 删除链表的倒数第 N 个结点
- 20. 有效的括号
- 22. 括号生成
- 23. 合并K个升序链表
- 24. 两两交换链表中的节点
- 25. K 个一组翻转链表.md
- 26. 删除有序数组中的重复项
- 27. 移除元素
- 31. 下一个排列
- 33. 搜索旋转排序数组
- 34. 在排序数组中查找元素的第一个和最后一个位置
- 39. 组合总和
- 40. 组合总和 II
- 41. 缺失的第一个正数
- 42. 接雨水
- 45. 跳跃游戏 II
- 46. 全排列
- 47. 全排列 II
- 48. 旋转图像
- 50. Pow(x, n)
- 55. 跳跃游戏
- 56. 合并区间
- 57. 插入区间
- 60. 排列序列
- 61. 旋转链表
- 63. 不同路径 II
- 64. 最小路径和
- 69. x 的平方根
- 72. 编辑距离
- 75. 颜色分类
- 76. 最小覆盖子串
- 77. 组合
- 79. 单词搜索
- 80. 删除有序数组中的重复项 II
- 81. 搜索旋转排序数组 II
- 82. 删除排序链表中的重复元素 II
- 83. 删除排序链表中的重复元素
- 单调栈
- 90. 子集 II
- 92. 反转链表 II
- 93. 复原 IP 地址
- 96. 不同的二叉搜索树
- 101. 对称二叉树
- 105. 从前序与中序遍历序列构造二叉树
- 114. 二叉树展开为链表
- 121. 买卖股票的最佳时机
- 124. 二叉树中的最大路径和
- 128. 最长连续序列
- 136. 只出现一次的数字
- 141. 环形链表
- 142. 环形链表 II
- 146. LRU 缓存
- 148. 排序链表
- 152. 乘积最大子数组
- 160. 相交链表
- 169. 多数元素
- 198. 打家劫舍
- 200. 岛屿数量
- 206. 反转链表
- 215. 数组中的第K个最大元素
- 221. 最大正方形
- 226. 翻转二叉树
- 234. 回文链表
- 236. 二叉树的最近公共祖先
- 238. 除自身以外数组的乘积
- 239. 滑动窗口最大值
- 240. 搜索二维矩阵 II
- 279. 完全平方数
- 283. 移动零
- 287. 寻找重复数
- 300. 最长递增子序列
- 309. 最佳买卖股票时机含冷冻期
- 714. 买卖股票的最佳时机含手续费
- 338. 比特位计数
- 347. 前 K 个高频元素
- 416. 分割等和子集
- 438. 找到字符串中所有字母异位词
- 448. 找到所有数组中消失的数字
- 461. 汉明距离
- 494. 目标和
- 538. 把二叉搜索树转换为累加树
- 543. 二叉树的直径
- 560. 和为 K 的子数组
- 581. 最短无序连续子数组
- 617. 合并二叉树
- 647. 回文子串
- 739. 每日温度
- 二叉树(一)
- 二叉树(二)
- 二叉树(三)
- 二叉树的层次遍历
- 二叉树的层平均值
- N叉树的层次遍历
- 二叉树非递归遍历
- 404、二叉树左叶子之和
- 513、找树左下角的值
- 112、路径总和
- 617、合并二叉树
- 700、二叉搜索树中的搜索
- 297、二叉树的序列化
- 二叉搜索树(一)
- 二叉搜索树(二)
- 二叉搜索树(三)
- 剑指 Offer 28. 对称的二叉树
- 104. 二叉树的最大深度
- 257. 二叉树的所有路径
- 236. 二叉树的最近公共祖先
- 226. 翻转二叉树
- 222、完全二叉树节点个数
- 判断是否是平衡二叉树
- 最大键值和
- 530、二叉搜索树的最小绝对差.md
- 701、二叉搜索树中的插入
- 450、二叉搜索树中的删除
- 108.将有序数组转换为二叉搜索树
动态规划问题步骤
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
动态规划一定要记住的三个条件:重叠子问题,最优子结构,状态转移方程。
明确「状态」 -> 定义 dp 数组/函数的含义 -> 明确「选择」-> 明确 base case。
- 动态规划问题框架
- 详解动态规划
- 动态规划的两个问题
- 剑指 Offer II 088. 爬楼梯的最少成本.md
- 动态规划空间优化,机器人路径1
- 63. 不同路径 II
- 343. 整数拆分
- 96. 不同的二叉搜索树
- 0-1背包框架一
- 0-1背包问题二
- 416. 分割等和子集
- 1049. 最后一块石头的重量 II
- 494. 目标和
- 完全背包
- 518. 零钱兑换 II
- 377. 组合总和 Ⅳ
- 爬楼梯
- 322. 零钱兑换
- 279. 完全平方数
- 背包问题
- 198. 打家劫舍
- 213. 打家劫舍 II
- 121. 买卖股票的最佳时机
- 122. 买卖股票的最佳时机 II
- 300. 最长递增子序列
- 674. 最长连续递增序列
- 718. 最长重复子数组
- 1143. 最长公共子序列
- 1035. 不相交的线
- 53. 最大子数组和
- 392. 判断子序列
- 115. 不同的子序列
- 583. 两个字符串的删除操作
- 72. 编辑距离
- 647. 回文子串
- 516. 最长回文子序列
- DP26跳跃游戏(一)
- 45. 跳跃游戏 II
注:动态规划篇很多参考labuladong的算法,只是为了记录笔记学习,没有其他任何商业用途。
贪心算法一般分为如下四步:
-
将问题分解为若干个子问题
-
找出适合的贪心策略
-
求解每一个子问题的最优解
-
将局部最优解堆叠成全局最优解
- 二分查找框架
- 二分搜索二
- [二分搜索三](https://github.com/justdoitMr/Algorithm/blob/main/Note/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE(%E4%B8%89%EF%BC%89.md)
- 二分搜索四
- 33. 搜索旋转排序数组