这个仓库整理了 B 站《算法太难了》系列视频对应的 Java 代码,并补充了一批常见经典算法题实现。代码按题目类型分包,适合用来快速查找某个算法模板、对照视频学习,或作为刷题时的参考实现。
src/main/java/
├── arr/ 数组
├── backtracking/ 回溯
├── binarySearch/ 二分查找
├── bit/ 位运算
├── dp/ 动态规划
├── graph/ 图算法
├── hash/ 哈希表
├── heap/ 堆
├── linkedList/ 链表
├── math/ 数学
├── matrix/ 二维数组 / 矩阵
├── sort/ 排序
├── stackQueue/ 栈和队列
├── str/ 字符串
├── tree/ 二叉树
├── trie/ 前缀树
├── twoPointers/ 双指针 / 滑动窗口
└── unionFind/ 并查集
辅助节点类位于 linkedList/ListNode.java 和 tree/TreeNode.java。新增题目的简单回归检查位于 src/test/java/RecentAddedProblemsCheck.java。
- JDK 8+
- Maven 3.x
编译并运行 Maven 默认检查:
mvn test部分题目类包含 main 方法,可以直接在 IDE 中运行对应类查看示例输出。
每个包按算法分类组织,类名大多使用 Solution、Solution2、Solution3 递增命名。具体题目和文件的对应关系以 README 中的表格为准。
| B站编号 | 力扣编号 | 代码位置 |
|---|---|---|
| 【算法太难了】【1】斐波那契数列-动态规划入门(入坑?) | 509. 斐波那契数 | dp/Solution.java |
| 【算法太难了】【2】连续子数组的最大和-动态规划 | 剑指 Offer 42. 连续子数组的最大和 | dp/Solution2.java |
| 【算法太难了】【3】缺失的数字-二分 | 剑指 Offer 53 - II. 0~n-1中缺失的数字(视频中代码有BUG) | binarySearch/Solution.java |
| 【算法太难了】【4】搜索旋转数组-二分 | 33. 搜索旋转排序数组 | binarySearch/Solution2.java |
| 【算法太难了】【5】反转链表-链表 | 剑指 Offer 24. 反转链表 | linkedList/Solution.java |
| 【算法太难了】【6】删除链表的倒数第N个节点-链表&双指针 | 19. 删除链表的倒数第 N 个结点 | linkedList/Solution2.java |
| 【算法太难了】【7】二叉搜索树转双向链表-二叉树&递归 | 剑指 Offer 36. 二叉搜索树与双向链表(略不同) | tree/Solution.java |
| 【算法太难了】【8】平衡树检查-二叉树 | 110. 平衡二叉树 | tree/Solution2.java |
| 【算法太难了】【9】链表是否有环-双指针 | 141. 环形链表 | twoPointers/Solution.java |
| 【算法太难了】【10】最长无重复子串-双指针&哈希 | 3. 无重复字符的最长子串 | twoPointers/Solution2.java |
| 【算法太难了】【11】用两个栈实现队列-栈&队列 | 剑指 Offer 09. 用两个栈实现队列 | stackQueue/Solution.java |
| 【算法太难了】【12】括号序列-栈 | 20. 有效的括号 | stackQueue/Solution2.java |
| 【算法太难了】【13】二叉树层序遍历-队列&二叉树 | 102. 二叉树的层序遍历 | stackQueue/Solution3.java |
| 【算法太难了】【14】缺失的数字-位运算 | 136. 只出现一次的数字 | bit/Solution.java |
| 【算法太难了】【15】二进制中1的个数-位运算 | 剑指 Offer 15. 二进制中1的个数 | bit/Solution2.java |
| 【算法太难了】【16】两数之和-哈希 | 1. 两数之和 | hash/Solution.java |
| 【算法太难了】【17】最长公共子串-二维数组&字符串 | 718. 最长重复子数组(略不同) | matrix/Solution.java |
| 【算法太难了】【18】像素翻转-二维数组 | 面试题 01.07. 旋转矩阵 | matrix/Solution2.java |
| 【算法太难了】【19】基本字符串压缩-字符串 | 面试题 01.06. 字符串压缩(视频中代码有BUG) | str/Solution2.java |
| 【算法太难了】【20】翻转子串-字符串 | 796. 旋转字符串 | str/Solution.java |
| 【算法太难了】【21】零钱兑换1-动态规划 | 518. 零钱兑换 II | dp/Solution3.java |
| 【算法太难了】【22】零钱兑换2-动态规划 | 322. 零钱兑换(视频中代码有BUG) | dp/Solution4.java |
| 【算法太难了】【23】最长递增子序列-动态规划 | 300. 最长递增子序列 | dp/Solution5.java |
| 【算法太难了】【24】走方格-动态规划 | 62. 不同路径 | dp/Solution6.java |
| 【算法太难了】【25】数据流中的中位数-堆 | 剑指 Offer 41. 数据流中的中位数 | heap/Solution.java |
| 【算法太难了】【26】从1加到N-递归 | 剑指 Offer 64. 求1+2+…+n | math/Solution2.java |
| 【算法太难了】【27】验证二叉搜索树-树 | 98. 验证二叉搜索树 | tree/Solution3.java |
| 【算法太难了】【28】最近公共祖先-树 | 236. 二叉树的最近公共祖先 | tree/Solution4.java |
| 【算法太难了】【29】二叉树的镜像-树 | 剑指 Offer 27. 二叉树的镜像 | tree/Solution5.java |
| 【算法太难了】【30】对称二叉树-树 | 剑指 Offer 28. 对称的二叉树 | tree/Solution6.java |
| 【算法太难了】【31】单词距离-字符串 | 面试题 17.11. 单词距离 | str/Solution3.java |
| 【算法太难了】【32】最长回文子串-字符串 | 5. 最长回文子串 | str/Solution4.java |
| 【算法太难了】【33】岛屿数量-二维数组&DFS | 200. 岛屿数量 | matrix/Solution3.java |
| 【算法太难了】【34】最大黑方阵-二维数组&动态规划 | 面试题 17.23. 最大黑方阵 | matrix/Solution4.java |
| 【算法太难了】【35】二维数组中的查找-二维数组&双指针 | 剑指 Offer 04. 二维数组中的查找 | matrix/Solution5.java |
| 【算法太难了】【36】矩阵中的路径-二维数组&DFS&回溯 | 剑指 Offer 12. 矩阵中的路径 | matrix/Solution6.java |
| 【算法太难了】【37】最大数-排序 | 179. 最大数 | sort/Solution.java |
| 【算法太难了】【38】合并两个有序数组-排序&双指针 | 88. 合并两个有序数组 | sort/Solution2.java |
| 【算法太难了】【39】合并K个升序链表-排序&链表&堆 | 23. 合并K个升序链表 | sort/Solution3.java |
| 【算法太难了】【40】排序链表-归并排序 | 148. 排序链表 | sort/Solution4.java |
| 【算法太难了】【41】链表的第一个公共节点-链表 | 剑指 Offer 52. 两个链表的第一个公共节点 | linkedList/Solution3.java |
| 【算法太难了】【42】删除链表中的节点-链表 | 237. 删除链表中的节点 | linkedList/Solution4.java |
| 【算法太难了】【43】旋转数组-数组 | 189. 旋转数组 | arr/Solution.java |
| 【算法太难了】【44】接雨水-数组&动态规划 | 42. 接雨水 | arr/Solution2.java |
| 【算法太难了】【45】多数元素-数组 | 169. 多数元素 | arr/Solution3.java |
| 【算法太难了】【46】移动零-数组 | 283. 移动零 | arr/Solution4.java |
| 【算法太难了】【47】打家劫舍-动态规划 | 198. 打家劫舍 | dp/Solution7.java |
| 【算法太难了】【48】买卖股票1-数组 | 121. 买卖股票的最佳时机 | arr/Solution5.java |
| 【算法太难了】【49】买卖股票2-数组 | 122. 买卖股票的最佳时机 II | arr/Solution6.java |
| 【算法太难了】【50】Java计算圆周率到10000位-大数运算 | 优化后的圆周率计算 | math/Solution3.java |
| 【算法太难了】【51】实现LRU缓存-LinkedHashMap | 面试题 16.25. LRU 缓存 | hash/LRUCache.java |
| 【算法太难了】【52】回文排列-哈希 | 面试题 01.04. 回文排列 | hash/Solution2.java |
| 【算法太难了】【53】数组中重复的数字-原地哈希 | 剑指 Offer 03. 数组中重复的数字 | hash/Solution3.java |
| 【算法太难了】【54】盛最多水的容器-双指针 | 11. 盛最多水的容器 | twoPointers/Solution3.java |
| 【算法太难了】【55】长度最小的子数组-双指针&滑动窗口 | 209. 长度最小的子数组 | twoPointers/Solution4.java |
| 【算法太难了】【56】和为s的两个数字-双指针 | 剑指 Offer 57. 和为s的两个数字 | twoPointers/Solution5.java |
| 【算法太难了】【57】调整数组顺序使奇数位于偶数前面-双指针 | 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 | twoPointers/Solution6.java |
| 【算法太难了】【58】配对交换-位运算 | 面试题 05.07. 配对交换 | bit/Solution3.java |
| 【算法太难了】【59】扑克牌中的顺子-数学 | 剑指 Offer 61. 扑克牌中的顺子 | math/Solution.java |
| 【算法太难了】【60】将有序数组转换为二叉搜索树-二叉树&二分&递归 | 108. 将有序数组转换为二叉搜索树 | tree/Solution7.java |
| 名称 | 代码位置 |
|---|---|
| 经典 N 皇后问题 (默认 8 皇后) | backtracking/Solution.java |
| 93. 复原 IP 地址 (Restore IP Addresses) | backtracking/Solution2.java |
| 72. 编辑距离 (Edit Distance) | dp/Solution8.java |
| 1584. 连接所有点的最小费用 (Prim 算法,曼哈顿距离) | graph/Solution.java |
| Dijkstra 算法实现 (基于最小堆优化) | graph/Solution2.java |
| 计算自然常数 e | math/Solution4.java |
| 计算 ln(2) | math/Solution5.java |
| 84. 柱状图中最大的矩形 | stackQueue/Solution4.java |
| 基础计算器 (支持 + - * / ( ) 和 整数) | stackQueue/Solution5.java |
| 28. 实现 strStr() (KMP 算法) | str/Solution5.java |
| 208. 实现 Trie (前缀树) | trie/Solution.java |
| 15. 三数之和 (3Sum) | twoPointers/Solution7.java |
| 经典算法:并查集 (Union-Find) | unionFind/Solution.java |
| 207. 课程表 | graph/Solution3.java |
| 1143. 最长公共子序列 | dp/Solution9.java |
| 76. 最小覆盖子串 | str/Solution6.java |
| 105. 从前序与中序遍历构造二叉树 | tree/Solution8.java |
| 124. 二叉树中的最大路径和 | tree/Solution9.java |
| 215. 数组中的第K个最大元素 | heap/Solution2.java |
| 56. 合并区间 | sort/Solution5.java |