刷题总结(LeetCode,面经,剑指offer)
Java JavaScript 输入输出
Java 集合用法
链接 |
---|
Java ArrayList和Array常用方法 |
Java String常用方法 |
Java Stack,Queue,PriorityQueue,deque相关操作 |
Java Map的常用方法 |
Java Set详解 |
数组
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——1.二维数组中的查找 | |
剑指offer | 剑指offer系列——13.调整数组顺序使奇数位于偶数前面 | |
剑指offer | 剑指offer系列——19.顺时针打印矩阵 | |
剑指offer | 剑指offer系列——28.数组中出现次数超过一半的数字 | |
剑指offer | 剑指offer系列——30.连续子数组的最大和 | 动态规划(更好)或分治法(太复杂) |
剑指offer | 剑指offer系列——32.把数组排成最小的数 | |
剑指offer | 剑指offer系列——45.扑克牌顺子 | |
剑指offer | 剑指offer系列——50.数组中重复的数字 | * |
剑指offer | 剑指offer系列——51.构建乘积数组 | |
LeetCode | LeetCode——分发糖果 | |
LeetCode | LeetCode——加油站 | |
LeetCode | LeetCode——最长连续序列 | |
LeetCode | LeetCode——字母异位词分组 | |
LeetCode | LeetCode——缺失的第一个正数 | |
LeetCode | LeetCode——寻找两个有序数组的中位数 | |
LeetCode | LeetCode——第三大的数 | |
LeetCode | LeetCode——使数组唯一的最小增量 | hash冲突的线性探测,路径压缩 |
LeetCode | LeetCode——三维形体的表面积 | |
LeetCode | LeetCode——最接近的三数之和 | |
LeetCode | LeetCode——和等于 k 的最长子数组长度 |
链表
找链表的中点:
ListNode slow = head;
ListNode fast = head.next;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——3.从尾到头打印链表 | |
剑指offer | 剑指offer系列——14.链表中倒数第k个结点 | 典型双指针问题 |
剑指offer | 剑指offer系列——15.反转链表 | *这个是个更典型的递归问题。 |
剑指offer | 剑指offer系列——16.合并两个排序的链表 | |
剑指offer | 剑指offer系列——25.复杂链表的复制 | |
剑指offer | 剑指offer系列——36.两个链表的第一个公共结点 | |
剑指offer | 剑指offer系列——55.链表中环的入口结点 | |
剑指offer | 剑指offer系列——56.删除链表中重复的结点 | |
LeetCode | LeetCode——排序链表 | |
LeetCode | LeetCode——对链表进行插入排序 | |
LeetCode | LeetCode——重排链表 | |
LeetCode | LeetCode——两两交换链表中的节点 | |
LeetCode | LeetCode——两数相加 | |
LeetCode | LeetCode——回文链表 | 重点:reverse |
二叉树
动态规划
字符串
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——2.替换空格 | |
剑指offer | 剑指offer系列——34.第一个只出现一次的字符 | |
剑指offer | 剑指offer系列——43.左旋转字符串 | 典型两次翻转 |
剑指offer | 剑指offer系列——44.翻转单词顺序列/翻转字符串里的单词 | |
剑指offer | 剑指offer系列——49.把字符串转换成整数 | |
剑指offer | 剑指offer系列——53.表示数值的字符串 | |
LeetCode | LeetCode——验证回文串 | |
LeetCode | LeetCode——最长公共前缀 | 1.分治法 2.字典树 |
LeetCode | LeetCode——简化路径 | |
面试金典 | 面试金典——模式匹配 | |
LeetCode | LeetCode——设计搜索自动补全系统 | 也可以用字典树 |
LeetCode | LeetCode——统计重复个数 | |
面试金典 | 面试金典——字符串压缩 | |
LeetCode | LeetCode——删除字符串中的所有相邻重复项 II | |
LeetCode | LeetCode——字符串相乘 | |
LeetCode | LeetCode——判断子序列 | |
LeetCode | LeetCode——回文子串 |
图(DFS,BFS,回溯)
系列 | 链接 | 备注 |
---|---|---|
总结 | LeetCode刷题之BFS和DFS | * |
剑指offer | 剑指offer系列——27.字符串的排序(全排序) | 回溯 |
剑指offer | 剑指offer系列——65.矩阵中的路径 | |
剑指offer | 剑指offer系列——66.机器人的运动范围 | |
LeetCode | LeetCode——单词拆分 ii | * |
LeetCode | LeetCode——克隆图 | |
LeetCode | LeetCode——分割回文串 | * |
LeetCode | LeetCode——被围绕的区域 | |
LeetCode | LeetCode——求根到叶子节点数字之和 | |
LeetCode | LeetCode——单词接龙 | * |
LeetCode | LeetCode——单词接龙 II | DFS结合BFS* |
LeetCode | LeetCode——子集 i-ii | |
LeetCode | LeetCode——不同路径 i-ii | |
LeetCode | LeetCode——网络延迟时间 | Dijkstra/Floyd/SPFA/Bellman-ford算法* |
LeetCode | LeetCode——岛屿数量 | DFS和BFS两种方法 |
LeetCode | LeetCode——迷宫 i-ii | DFS和BFS两种方法 |
LeetCode | LeetCode——N皇后 | * |
LeetCode | LeetCode——N皇后 II | +bitmap回溯 |
LeetCode | LeetCode——覆盖 | |
LeetCode | LeetCode——24 点游戏 | |
LeetCode | LeetCode——字典序排数 | |
LeetCode | LeetCode——字典序的第K小数字 | DFS剪枝,非典型DFS |
LeetCode | LeetCode——复原IP地址 | |
LeetCode | LeetCode——课程表 i-ii | 拓扑排序,DFS/BFS |
LeetCode | LeetCode——课程安排 IV | Floyd/打表法,DFS/BFS |
LeetCode | LeetCode——矩阵中的最长递增路径 | 记忆深度搜索 / 拓扑排序BFS |
LeetCode | LeetCode——最低成本联通所有城市 | 最小生成树,kruskal 算法 和 Prim算法 |
LeetCode | LeetCode——滑动谜题 | BFS,A*搜索算法 |
LeetCode | LeetCode——打开转盘锁 | BFS 与 双向BFS |
LeetCode | LeetCode——重新安排行程 | 欧拉回路,Hierholzer算法 |
递归
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——7.斐波拉契数列 | |
剑指offer | 剑指offer系列——8.跳台阶 9.变态跳台阶 | |
剑指offer | 剑指offer系列——10.矩阵覆盖 | |
剑指offer | 剑指offer系列——15.反转链表 | * |
LeetCode | LeetCode——字符串解码 | 递归或栈 |
栈,队列
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——5.用两个栈实现队列/一个队列实现栈 | * |
剑指offer | 剑指offer系列——20.包含min函数的栈 | |
剑指offer | 剑指offer系列——21.栈的压入、弹出系列 | |
剑指offer | 剑指offer系列——54.字符流中第一个不重复的字符 | |
剑指offer | 剑指offer系列——63.数据流中的中位数 | |
剑指offer | 剑指offer系列——64.滑动窗口的最大值 | |
LeetCode | LeetCode——逆波兰表达式求值 | 后缀表达式 |
LeetCode | LeetCode——每日温度 | 单调栈 |
LeetCode | LeetCode——柱状图中最大的矩形 | 单调栈* |
LeetCode | LeetCode——最长有效括号 | |
LeetCode | LeetCode——不同字符的最小子序列/去除重复字母 |
位运算/数学问题
组合:
public static long combination(int m, long n) {
if (m == n)
return 1;
if (m == 0)
return 1;
return combination(m, n - 1) + combination(m - 1, n - 1);
}
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——11.二进制中1的个数 | * |
剑指offer | 剑指offer系列——12.数值的整数次方 | 尤其是快速幂和快速乘的复习* |
剑指offer | 剑指offer系列——31.整数中1出现的次数 | * |
剑指offer | 剑指offer系列——33.丑数 | |
剑指offer | 剑指offer系列——40.数组中只出现一次的数字 | |
剑指offer | 剑指offer系列——47.求1+2+……+n | * |
剑指offer | 剑指offer系列——48.不用加减乘除做加法* | |
剑指offer | 剑指offer系列——67.剪绳子 | |
LeetCode | LeetCode——直线上最多的点数 | |
LeetCode | LeetCode——格雷码 | |
LeetCode | LeetCode——阶乘后的零 | |
LeetCode | LeetCode——整数反转 | |
面试金典 | 面试金典——交点 | |
LeetCode | LeetCode——矩形重叠 | |
LeetCode | LeetCode——数字转换为十六进制数 | * |
LeetCode | LeetCode——最大单词长度乘积 | |
LeetCode | LeetCode——最小移动次数使数组元素相等 | |
LeetCode | LeetCode——每个元音包含偶数次的最长子字符串 | * |
LeetCode | LeetCode——计数质数 |
双指针/滑动窗口
滑动窗口算法,应先增大窗口,再缩小窗口,再对窗口内部进行处理。
int left=0,right = 0;
while(right<s.length){
window.add(s[right]);
right++;
while(left <= right && 超出条件){
window.remove(s[left]);
left++;
}
if(满足条件){
window处理
}
}
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——14.链表中倒数第k个结点 | |
剑指offer | 剑指offer系列——41.和为S的连续正数序列 | |
剑指offer | 剑指offer系列——42.和为S的两个数字 | |
LeetCode | LeetCode——无重复字符的最长子串 | 动态规划也可以 |
LeetCode | LeetCode——最小覆盖子串 | * |
LeetCode | LeetCode——字符串的排列/找到字符串中所有字母异位词 | * |
LeetCode | LeetCode——滑动窗口中位数 | 中位数参考:数据流中的中位数 |
LeetCode | LeetCode——至多包含 K 个不同字符的最长子串 |
排序/区间合并
系列 | 链接 | 备注 |
---|---|---|
总结 | 排序算法汇总 | * |
剑指offer | 剑指offer系列——27.字符串的排序(全排序) | 字典排序 |
剑指offer | 剑指offer系列——29.最小的K个数 | |
LeetCode | LeetCode——分类颜色 | 计数排序 |
LeetCode | LeetCode——最大间距 | 桶排序、基数排序* |
LeetCode | LeetCode——无重叠区间 | 区间调度问题,贪心算法 |
LeetCode | LeetCode——用最少数量的箭引爆气球 | 贪心算法 |
LeetCode | LeetCode——煎饼排序 | |
LeetCode | LeetCode——插入区间 | |
LeetCode | LeetCode——合并K个升序链表 | 堆排序 |
LeetCode | LeetCode——合并区间 | |
LeetCode | LeetCode——区间交集 | |
LeetCode | LeetCode——俄罗斯套娃信封问题 | |
LeetCode | LeetCode——递增的三元子序列 | |
LeetCode | LeetCode——删除被覆盖区间 |
二分法/分治法(归并)
二分公式:
1、分析二分查找代码时,不要出现 else,全部展开成 else if 方便理解。
2、注意「搜索区间」和 while 的终止条件,如果存在漏掉的元素,记得在最后检查。
3、如需定义左闭右开的「搜索区间」搜索左右边界,只要在nums[mid] == target时做修改即可,搜索右侧时需要减一。
4、如果将「搜索区间」全都统一成两端都闭,好记,只要稍改nums[mid] == target条件处的代码和返回的逻辑即可.
int binary_search(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while(left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else if(nums[mid] == target) {
// 直接返回
return mid;
}
}
// 直接返回
return -1;
}
int left_bound(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] == target) {
// 别返回,锁定左侧边界
right = mid - 1;
}
}
// 最后要检查 left 越界的情况
if (left >= nums.length || nums[left] != target)
return -1;
return left;
}
int right_bound(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] == target) {
// 别返回,锁定右侧边界
left = mid + 1;
}
}
// 最后要检查 right 越界的情况
if (right < 0 || nums[right] != target)
return -1;
return right;
}
系列 | 链接 | 备注 |
---|---|---|
剑指offer | 剑指offer系列——6.旋转数组的最小数字/搜索旋转排序数组 | * |
剑指offer | 剑指offer系列——35.数组中的逆序对 | * |
剑指offer | 剑指offer系列——37.数字在排序数组中出现的次数 LeetCode——在排序数组中查找元素的第一个和最后一个位置 |
典型二分查找* |
LeetCode | LeetCode——计算右侧小于当前元素的个数 | 分治法 |
LeetCode | LeetCode——搜索插入位置 | |
LeetCode | LeetCode——最长上升子序列/最长递增子序列的个数 | *也可以动态规划 |
LeetCode | LeetCode——分割数组的最大值 | 也可以动态规划 |
LeetCode | LeetCode——x 的平方根/有效的完全平方数 | 二分法,递推法,牛顿法 |
特殊结构或算法
系列 | 链接 | 备注 |
---|---|---|
总结 | LeetCode——多线程问题汇总 | * |
剑指offer | 剑指offer系列——46.孩子们的游戏(圆圈中最后剩下的数) | 约瑟夫环 |
LeetCode | LeetCode——LRU Cache | *LRU |
LeetCode | LeetCode——Nim游戏 | |
LeetCode | LeetCode——实现 strStr() | KMP算法* |
LeetCode | LeetCode——实现Trie | 字典树 |
LeetCode | LeetCode——朋友圈 | 并查集 |
LeetCode | LeetCode——冗余连接/以图判树 | 并查集 |
LeetCode | LeetCode——区域和检索-数组可修改 | 线段树 |
LeetCode | LeetCode——电灯开关 | |
LeetCode | LeetCode——最长重复子串 | Rabin-Karp 字符串编码 |
LeetCode | LeetCode——覆盖 | 匈牙利算法 |
LeetCode | LeetCode——打乱数组 | 洗牌算法 |
LeetCode | LeetCode——链表随机节点/随机数索引 | 蓄水池算法 |
LeetCode | LeetCode——哲学家进餐问题 | 经典信号量问题 |
LeetCode | LeetCode——不同的二叉搜索树 | 卡特兰数 |
LeetCode | LeetCode——找到小镇的法官 | 七桥问题 |
LeetCode | LeetCode——常数时间插入、删除和获取随机元素 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决