LEETCODE JAVA ARCHIVE
LeetCode 多解法题库
由旧 Java 题库逐文件复核而来:按真实题号去重,拆分混合题目,修正明显实现问题,并补齐解题主线、复杂度与边界清单。
152
去重题目
217
整理后解法
166
已复核旧源码
找到 152 道题,共 217 个整理后的解法
两数之和
简单在数组中找到和为 target 的两个不同元素下标;题目保证恰有一个答案。
两数相加
中等两个链表按逆序保存十进制数字,逐位相加并返回同样逆序保存的结果链表。
无重复字符的最长子串
中等返回字符串中不含重复字符的最长连续子串长度。
最长回文子串
中等返回字符串中长度最长的回文连续子串。
字符串转换整数 (atoi)
中等按前导空格、可选符号和连续数字的规则解析 32 位有符号整数,并在溢出时截断。
盛最多水的容器
中等选择两条竖线,使它们与横轴围成的容器面积最大。
最长公共前缀
简单返回字符串数组中所有字符串共有的最长起始片段。
三数之和
中等返回数组中所有和为 0 且互不重复的三元组。
电话号码的字母组合
中等按数字到字母的映射逐位选择字符,枚举所有可能的字符串。
四数之和
中等返回数组中所有和为 target 且互不重复的四元组。
删除链表的倒数第 N 个结点
中等使用相距 n 个节点的快慢指针,一趟扫描定位并删除倒数第 n 个节点。
有效的括号
简单判断括号字符串是否按正确类型和嵌套顺序闭合。
合并两个有序链表
简单复用原节点,把两个非递减链表合并为一个非递减链表。
括号生成
中等在任意前缀都合法的约束下,生成 n 对括号的全部组合。
合并 K 个升序链表
困难合并 k 个非递减链表,复用原节点并返回一个整体非递减的链表。
两两交换链表中的节点
中等不修改节点值,将单链表中每两个相邻节点交换。
K 个一组翻转链表
困难每 k 个节点组成一组原地翻转,末尾不足 k 个节点时保持原顺序。
移除元素
简单原地移除所有等于 val 的元素,返回剩余元素形成的有效前缀长度。
找出字符串中第一个匹配项的下标
简单返回 needle 在 haystack 中首次完整出现的起始下标,不存在则返回 -1。
下一个排列
中等原地把数组改为字典序中的下一个排列;若已是最大排列则改为最小排列。
搜索旋转排序数组
中等在无重复值的旋转升序数组中以 O(log n) 时间查找目标下标。
在排序数组中查找元素的第一个和最后一个位置
中等在非递减数组中返回 target 的起止下标,不存在时返回 [-1, -1]。
解数独
困难为每个空格尝试不与所在行、列和九宫格冲突的数字,找到一个完整解后立即停止。
组合总和
中等从互不相同的正整数中可重复选数,找出总和等于 target 的所有组合。
组合总和 II
中等每个下标最多使用一次,在含重复值的数组中找出和为 target 的不重复组合。
接雨水
困难给定柱状图高度,计算下雨后柱子之间能够承接的水量。
字符串相乘
中等不使用大整数类型,也不把完整输入转换为整数,返回两个非负整数字符串的乘积。
全排列
中等对不含重复值的数组,生成元素的全部排列。
全排列 II
中等为可能含重复值的数组生成所有互不重复的排列。
旋转图像
中等把 n×n 矩阵顺时针旋转 90 度,推荐原地完成。
N 皇后
困难在 n × n 棋盘上放置 n 个皇后,使任意两个皇后不在同列或同一条对角线上。
最大子数组和
中等在非空整数数组中寻找和最大的连续子数组,并返回其元素和。
螺旋矩阵
中等从左上角开始顺时针逐层返回矩阵中的所有元素。
合并区间
中等合并所有重叠区间并返回互不重叠的区间集合。
螺旋矩阵 II
中等按顺时针螺旋顺序把 1 到 n² 填入 n×n 矩阵。
最小路径和
中等从网格左上角只向右或向下移动,求到右下角的最小路径数字和。
x 的平方根
简单返回非负整数 x 的算术平方根向下取整结果。
爬楼梯
简单每次爬 1 或 2 级台阶,计算到达第 n 级的不同方法数。
简化路径
中等把 Unix 风格绝对路径转换为规范路径。
编辑距离
困难计算把 word1 转换为 word2 所需的最少插入、删除或替换次数。
搜索二维矩阵
中等在每行递增且下一行首元素大于上一行尾元素的矩阵中判断 target 是否存在。
最小覆盖子串
困难在 s 中寻找包含 t 全部字符及其重复次数的最短连续子串。
组合
中等从 1 到 n 中选择 k 个不同整数,返回所有组合。
子集
中等返回不含重复元素数组的幂集。
删除排序链表中的重复元素 II
中等删除有序链表中所有出现过重复的值,只保留从未重复的节点。
删除排序链表中的重复元素
简单压缩有序链表中的连续重复值,使每个值只保留一个节点。
分隔链表
中等稳定地把小于 x 的节点放到其余节点之前,同时保持两组内部的原相对顺序。
合并两个有序数组
简单把 nums2 合并进预留了尾部空间的 nums1,使 nums1 整体非递减。
子集 II
中等返回可能含重复值数组的所有不重复子集。
反转链表 II
中等只反转链表从 left 到 right 的闭区间,其余节点位置保持不变。
复原 IP 地址
中等把纯数字字符串切成四段合法的 IPv4 地址,枚举所有切分方式。
二叉树的中序遍历
简单按左子树、根节点、右子树的顺序返回二叉树节点值。
验证二叉搜索树
中等判断一棵二叉树是否满足所有左子树值严格小于根、右子树值严格大于根。
相同的树
简单判断两棵二叉树的结构和对应节点值是否完全相同。
对称二叉树
简单判断二叉树是否关于根节点轴对称。
二叉树的层序遍历
中等按从上到下、每层从左到右的顺序返回节点值。
二叉树的锯齿形层序遍历
中等逐层遍历二叉树,并交替使用从左到右、从右到左的输出顺序。
二叉树的最大深度
简单计算根节点到最远叶子节点的最长路径所包含的节点数。
从前序与中序遍历序列构造二叉树
中等根据无重复值二叉树的前序和中序遍历恢复原树。
从中序与后序遍历序列构造二叉树
中等根据无重复值二叉树的中序和后序遍历恢复原树。
二叉树的层序遍历 II
中等按从叶子层到根层的顺序返回每层节点值。
将有序数组转换为二叉搜索树
简单把升序数组转换为一棵高度平衡二叉搜索树。
平衡二叉树
简单判断每个节点左右子树高度差是否都不超过一。
二叉树的最小深度
简单计算根节点到最近叶子节点的节点数。
路径总和
简单判断是否存在一条根到叶子的路径,其节点值之和等于目标值。
路径总和 II
中等返回所有节点值之和等于目标值的根到叶路径。
填充每个节点的下一个右侧节点指针
中等为完美二叉树的每个节点设置指向同层右侧相邻节点的 next 指针。
买卖股票的最佳时机
简单只允许完成一笔先买后卖的交易,求可获得的最大利润。
买卖股票的最佳时机 II
中等允许完成任意多笔交易但同一时间最多持有一股,求最大总利润。
买卖股票的最佳时机 III
困难最多完成两笔交易且同一时间只能持有一股,求最大利润。
二叉树中的最大路径和
困难寻找二叉树中任意非空简单路径的最大节点值之和,路径不要求经过根节点。
分割回文串
中等把字符串切分为若干回文子串,返回所有可能的切分方案。
环形链表
简单判断单链表中是否存在沿 next 可重复到达的环。
环形链表 II
中等若链表有环,返回环的入口节点;否则返回 null。
重排链表
中等把 L0 → L1 → … → Ln 原地重排为 L0 → Ln → L1 → Ln-1 → …,不能只交换节点值。
二叉树的前序遍历
简单按根节点、左子树、右子树的顺序返回节点值。
二叉树的后序遍历
简单按左子树、右子树、根节点的顺序返回节点值。
LRU 缓存
中等实现固定容量的最近最少使用缓存,使 get 与 put 平均 O(1)。
排序链表
中等使用适合链表的归并排序,在 O(n log n) 时间内按升序排列节点。
逆波兰表达式求值
中等计算有效逆波兰表达式,整数除法向零截断。
反转字符串中的单词
中等反转单词顺序,并把单词间的任意连续空格规范为一个空格。
最小栈
中等实现支持 push、pop、top 和 O(1) getMin 的栈。
相交链表
简单按节点引用而非节点值,返回两个单链表开始相交的节点;不相交返回 null。
寻找峰值
中等返回任意一个严格大于左右相邻元素的峰值下标,数组边界外视为负无穷。
比较版本号
中等逐段比较两个点分十进制版本号,忽略每段前导零和尾部零段。
买卖股票的最佳时机 IV
困难最多完成 k 笔交易且同一时间只能持有一股,求最大利润。
打家劫舍
简单在线性房屋中选择互不相邻的房屋,使偷窃金额总和最大。
二叉树的右视图
中等返回从右侧观察二叉树时每一层可见的节点。
岛屿数量
中等统计字符网格中由上下左右相邻的陆地 1 组成的岛屿数量。
快乐数
简单反复把整数替换为各位数字平方和,判断序列最终是否到达 1。
移除链表元素
简单删除单链表中所有值等于 val 的节点并返回新头节点。
反转链表
简单反转单链表的 next 方向并返回新的头节点。
长度最小的子数组
中等在正整数数组中寻找元素和至少为 target 的最短连续子数组,不存在时返回 0。
打家劫舍 II
中等房屋首尾相邻成环,选择互不相邻房屋使金额最大。
数组中的第 K 个最大元素
中等在未排序数组中返回按降序排列后的第 k 个元素,而不是第 k 个不同元素。
组合总和 III
中等从 1 到 9 中选择 k 个互不相同的数,使其和等于 n。
最大正方形
中等在只包含 0 和 1 的字符矩阵中,返回全为 1 的最大正方形面积。
完全二叉树的节点个数
简单统计一棵完全二叉树的节点总数。
用队列实现栈
简单只使用队列的标准操作,实现后进先出的栈接口。
翻转二叉树
简单交换二叉树每个节点的左右子树。
用栈实现队列
简单只使用栈的标准操作,实现先进先出的队列接口。
回文链表
简单判断单链表节点值从前向后与从后向前是否相同。
二叉搜索树的最近公共祖先
中等在二叉搜索树中寻找两个给定节点的最近公共祖先。
二叉树的最近公共祖先
中等在普通二叉树中寻找两个给定节点的最近公共祖先。
滑动窗口最大值
困难返回长度为 k 的窗口从左向右滑动时,每个窗口中的最大值。
搜索二维矩阵 II
中等在每行从左到右、每列从上到下都升序的矩阵中判断 target 是否存在。
有效的字母异位词
简单判断两个字符串是否由完全相同的字符及出现次数组成。
二叉树的所有路径
简单以“->”连接节点值,返回所有根到叶子的路径。
最长递增子序列
中等返回整数数组中严格递增子序列的最大长度,子序列不要求连续。
买卖股票的最佳时机含冷冻期
中等交易次数不限,但卖出后的下一天不能买入,求最大利润。
零钱兑换
中等用给定面额的无限枚硬币凑出 amount,返回所需最少硬币数,无法凑成时返回 -1。
重新安排行程
困难从 JFK 出发使用全部机票恰好一次,并返回字典序最小的有效行程。
打家劫舍 III
中等房屋组成二叉树,父子节点不能同时选择,求最大金额。
反转字符串
简单原地反转字符数组,不能分配另一份字符数组。
前 K 个高频元素
中等返回整数数组中出现频率最高的 k 个不同元素,答案顺序不限。
两个数组的交集
简单返回两个数组共有的不同元素,结果顺序任意。
俄罗斯套娃信封问题
困难每个信封必须在宽和高两个维度都严格小于外层信封,求最多可嵌套数量。
摆动序列
中等从数组中删除若干元素,使相邻差值严格正负交替,求最长摆动子序列长度。
赎金信
简单判断 ransomNote 能否由 magazine 中的字符组成,每个字符最多使用一次。
字符串解码
中等将 k[encoded_string] 按重复次数展开,编码可以嵌套且 k 可以有多位。
左叶子之和
简单计算二叉树中所有左叶子节点值的总和。
字符串相加
简单不把完整输入转换为整数,计算两个非负整数字符串之和。
删除二叉搜索树中的节点
中等删除二叉搜索树中值为 key 的节点,并保持搜索树性质。
四数相加 II
中等从四个等长数组各选一个元素,统计四数之和为 0 的下标元组数量。
分发饼干
简单每个孩子最多得到一块饼干,在尺寸满足胃口的前提下最大化被满足的孩子数。
重复的子字符串
简单判断非空字符串能否由某个更短子串重复若干次构成。
岛屿的周长
简单网格中只有一座不含湖泊的岛屿,计算陆地与海洋或边界接触的边数。
用 Rand7() 实现 Rand10()
中等只调用等概率返回 1 到 7 的 rand7(),实现等概率返回 1 到 10 的 rand10()。
非递减子序列
中等找出数组中所有长度至少为 2 的不同非递减子序列,同时保持原下标顺序。
找树左下角的值
中等返回二叉树最深一层最左侧节点的值。
二叉搜索树的最小绝对差
简单返回二叉搜索树任意两个不同节点值之间的最小绝对差。
把二叉搜索树转换为累加树
中等把每个节点值改为原树中大于等于该值的所有节点值之和。
反转字符串 II
简单每计数 2k 个字符,反转其中前 k 个;不足 k 个时反转全部剩余字符。
二叉树的直径
简单返回二叉树任意两节点间最长路径的边数。
另一棵树的子树
简单判断 subRoot 是否与 root 的某个节点为根的整棵子树完全相同。
合并二叉树
简单重叠节点值相加,非重叠节点直接保留,得到合并后的树。
最大二叉树
中等递归选择数组最大值为根,左右子数组分别构造左右子树。
修剪二叉搜索树
中等删除值不在闭区间 [low, high] 内的节点,并保持原节点相对结构。
岛屿的最大面积
中等在 0/1 网格中按上下左右连接陆地,返回最大岛屿包含的格子数。
二叉搜索树中的搜索
简单返回二叉搜索树中值等于目标值的节点及其子树。
二叉搜索树中的插入操作
中等将一个不存在于树中的值插入二叉搜索树并返回根节点。
二分查找
简单在严格升序数组中查找 target,存在则返回下标,否则返回 -1。
买卖股票的最佳时机含手续费
中等交易次数不限,每笔完整交易收取一次手续费,求最大利润。
根据前序和后序遍历构造二叉树
中等根据前序和后序遍历构造任意一棵符合条件的二叉树。
水果成篮
中等寻找只包含至多两种值的最长连续子数组,对应两个篮子可采摘的最多水果数。
排序数组
中等将整数数组按升序原地排序并返回;这里整理旧源码中的随机化快速排序。
有序数组的平方
简单将非递减数组的每个元素平方,并返回仍按非递减顺序排列的数组。
删除字符串中的所有相邻重复项
简单反复删除相邻且相同的两个字符,返回最终稳定字符串。
最长公共子序列
中等求两个字符串最长公共子序列的长度,子序列不要求连续。
跳台阶扩展问题
简单每次可跳 1 到 n 级,计算跳上 n 级台阶的不同方法数。
右旋字符串
简单把字符串最右侧 k 个字符移动到最前面,保持两段内部相对顺序。
训练计划 II
简单返回链表倒数第 cnt 个节点;该旧文件对应 LCR 140,而不是 LeetCode 140“单词拆分 II”。