返回算法知识地图

LEETCODE JAVA ARCHIVE

LeetCode 多解法题库

由旧 Java 题库逐文件复核而来:按真实题号去重,拆分混合题目,修正明显实现问题,并补齐解题主线、复杂度与边界清单。

152

去重题目

217

整理后解法

166

已复核旧源码

找到 152 道题,共 217 个整理后的解法

#1

两数之和

简单

在数组中找到和为 target 的两个不同元素下标;题目保证恰有一个答案。

数组哈希表双指针3 种解法
#2

两数相加

中等

两个链表按逆序保存十进制数字,逐位相加并返回同样逆序保存的结果链表。

链表数学模拟1 种解法
#3

无重复字符的最长子串

中等

返回字符串中不含重复字符的最长连续子串长度。

字符串哈希表滑动窗口1 种解法
#5

最长回文子串

中等

返回字符串中长度最长的回文连续子串。

字符串动态规划中心扩展2 种解法
#8

字符串转换整数 (atoi)

中等

按前导空格、可选符号和连续数字的规则解析 32 位有符号整数,并在溢出时截断。

字符串模拟1 种解法
#11

盛最多水的容器

中等

选择两条竖线,使它们与横轴围成的容器面积最大。

数组双指针贪心1 种解法
#14

最长公共前缀

简单

返回字符串数组中所有字符串共有的最长起始片段。

字符串纵向扫描分治3 种解法
#15

三数之和

中等

返回数组中所有和为 0 且互不重复的三元组。

数组排序双指针1 种解法
#17

电话号码的字母组合

中等

按数字到字母的映射逐位选择字符,枚举所有可能的字符串。

回溯字符串哈希映射1 种解法
#18

四数之和

中等

返回数组中所有和为 target 且互不重复的四元组。

数组排序双指针1 种解法
#19

删除链表的倒数第 N 个结点

中等

使用相距 n 个节点的快慢指针,一趟扫描定位并删除倒数第 n 个节点。

链表双指针1 种解法
#20

有效的括号

简单

判断括号字符串是否按正确类型和嵌套顺序闭合。

字符串1 种解法
#21

合并两个有序链表

简单

复用原节点,把两个非递减链表合并为一个非递减链表。

链表递归2 种解法
#22

括号生成

中等

在任意前缀都合法的约束下,生成 n 对括号的全部组合。

回溯字符串剪枝1 种解法
#23

合并 K 个升序链表

困难

合并 k 个非递减链表,复用原节点并返回一个整体非递减的链表。

链表分治优先队列2 种解法
#24

两两交换链表中的节点

中等

不修改节点值,将单链表中每两个相邻节点交换。

链表递归迭代2 种解法
#25

K 个一组翻转链表

困难

每 k 个节点组成一组原地翻转,末尾不足 k 个节点时保持原顺序。

链表分组指针1 种解法
#27

移除元素

简单

原地移除所有等于 val 的元素,返回剩余元素形成的有效前缀长度。

数组双指针原地修改2 种解法
#28

找出字符串中第一个匹配项的下标

简单

返回 needle 在 haystack 中首次完整出现的起始下标,不存在则返回 -1。

字符串字符串匹配1 种解法
#31

下一个排列

中等

原地把数组改为字典序中的下一个排列;若已是最大排列则改为最小排列。

数组双指针排列1 种解法
#33

搜索旋转排序数组

中等

在无重复值的旋转升序数组中以 O(log n) 时间查找目标下标。

数组二分查找1 种解法
#34

在排序数组中查找元素的第一个和最后一个位置

中等

在非递减数组中返回 target 的起止下标,不存在时返回 [-1, -1]。

数组二分查找1 种解法
#37

解数独

困难

为每个空格尝试不与所在行、列和九宫格冲突的数字,找到一个完整解后立即停止。

回溯矩阵位运算1 种解法
#39

组合总和

中等

从互不相同的正整数中可重复选数,找出总和等于 target 的所有组合。

回溯数组剪枝1 种解法
#40

组合总和 II

中等

每个下标最多使用一次,在含重复值的数组中找出和为 target 的不重复组合。

回溯数组排序1 种解法
#42

接雨水

困难

给定柱状图高度,计算下雨后柱子之间能够承接的水量。

数组双指针动态规划3 种解法
#43

字符串相乘

中等

不使用大整数类型,也不把完整输入转换为整数,返回两个非负整数字符串的乘积。

数学字符串模拟1 种解法
#46

全排列

中等

对不含重复值的数组,生成元素的全部排列。

回溯数组排列1 种解法
#47

全排列 II

中等

为可能含重复值的数组生成所有互不重复的排列。

回溯数组排序1 种解法
#48

旋转图像

中等

把 n×n 矩阵顺时针旋转 90 度,推荐原地完成。

数组矩阵原地修改2 种解法
#51

N 皇后

困难

在 n × n 棋盘上放置 n 个皇后,使任意两个皇后不在同列或同一条对角线上。

回溯棋盘剪枝1 种解法
#53

最大子数组和

中等

在非空整数数组中寻找和最大的连续子数组,并返回其元素和。

数组动态规划贪心3 种解法
#54

螺旋矩阵

中等

从左上角开始顺时针逐层返回矩阵中的所有元素。

数组矩阵模拟1 种解法
#56

合并区间

中等

合并所有重叠区间并返回互不重叠的区间集合。

数组排序贪心1 种解法
#59

螺旋矩阵 II

中等

按顺时针螺旋顺序把 1 到 n² 填入 n×n 矩阵。

数组矩阵模拟1 种解法
#64

最小路径和

中等

从网格左上角只向右或向下移动,求到右下角的最小路径数字和。

数组动态规划矩阵1 种解法
#69

x 的平方根

简单

返回非负整数 x 的算术平方根向下取整结果。

数学二分查找2 种解法
#70

爬楼梯

简单

每次爬 1 或 2 级台阶,计算到达第 n 级的不同方法数。

动态规划斐波那契2 种解法
#71

简化路径

中等

把 Unix 风格绝对路径转换为规范路径。

字符串1 种解法
#72

编辑距离

困难

计算把 word1 转换为 word2 所需的最少插入、删除或替换次数。

字符串动态规划1 种解法
#74

搜索二维矩阵

中等

在每行递增且下一行首元素大于上一行尾元素的矩阵中判断 target 是否存在。

数组矩阵二分查找2 种解法
#76

最小覆盖子串

困难

在 s 中寻找包含 t 全部字符及其重复次数的最短连续子串。

字符串哈希表滑动窗口1 种解法
#77

组合

中等

从 1 到 n 中选择 k 个不同整数,返回所有组合。

回溯组合剪枝1 种解法
#78

子集

中等

返回不含重复元素数组的幂集。

回溯数组子集1 种解法
#82

删除排序链表中的重复元素 II

中等

删除有序链表中所有出现过重复的值,只保留从未重复的节点。

链表双指针1 种解法
#83

删除排序链表中的重复元素

简单

压缩有序链表中的连续重复值,使每个值只保留一个节点。

链表1 种解法
#86

分隔链表

中等

稳定地把小于 x 的节点放到其余节点之前,同时保持两组内部的原相对顺序。

链表双指针1 种解法
#88

合并两个有序数组

简单

把 nums2 合并进预留了尾部空间的 nums1,使 nums1 整体非递减。

数组双指针排序1 种解法
#90

子集 II

中等

返回可能含重复值数组的所有不重复子集。

回溯数组排序1 种解法
#92

反转链表 II

中等

只反转链表从 left 到 right 的闭区间,其余节点位置保持不变。

链表1 种解法
#93

复原 IP 地址

中等

把纯数字字符串切成四段合法的 IPv4 地址,枚举所有切分方式。

回溯字符串剪枝1 种解法
#94

二叉树的中序遍历

简单

按左子树、根节点、右子树的顺序返回二叉树节点值。

二叉树深度优先搜索2 种解法
#98

验证二叉搜索树

中等

判断一棵二叉树是否满足所有左子树值严格小于根、右子树值严格大于根。

二叉搜索树深度优先搜索中序遍历3 种解法
#100

相同的树

简单

判断两棵二叉树的结构和对应节点值是否完全相同。

二叉树深度优先搜索广度优先搜索2 种解法
#101

对称二叉树

简单

判断二叉树是否关于根节点轴对称。

二叉树深度优先搜索1 种解法
#102

二叉树的层序遍历

中等

按从上到下、每层从左到右的顺序返回节点值。

二叉树广度优先搜索深度优先搜索2 种解法
#103

二叉树的锯齿形层序遍历

中等

逐层遍历二叉树,并交替使用从左到右、从右到左的输出顺序。

二叉树广度优先搜索双端队列1 种解法
#104

二叉树的最大深度

简单

计算根节点到最远叶子节点的最长路径所包含的节点数。

二叉树深度优先搜索广度优先搜索2 种解法
#105

从前序与中序遍历序列构造二叉树

中等

根据无重复值二叉树的前序和中序遍历恢复原树。

二叉树分治哈希表1 种解法
#106

从中序与后序遍历序列构造二叉树

中等

根据无重复值二叉树的中序和后序遍历恢复原树。

二叉树分治哈希表1 种解法
#107

二叉树的层序遍历 II

中等

按从叶子层到根层的顺序返回每层节点值。

二叉树广度优先搜索1 种解法
#108

将有序数组转换为二叉搜索树

简单

把升序数组转换为一棵高度平衡二叉搜索树。

二叉搜索树分治数组1 种解法
#110

平衡二叉树

简单

判断每个节点左右子树高度差是否都不超过一。

二叉树深度优先搜索后序遍历2 种解法
#111

二叉树的最小深度

简单

计算根节点到最近叶子节点的节点数。

二叉树深度优先搜索广度优先搜索2 种解法
#112

路径总和

简单

判断是否存在一条根到叶子的路径,其节点值之和等于目标值。

二叉树深度优先搜索1 种解法
#113

路径总和 II

中等

返回所有节点值之和等于目标值的根到叶路径。

二叉树深度优先搜索回溯1 种解法
#116

填充每个节点的下一个右侧节点指针

中等

为完美二叉树的每个节点设置指向同层右侧相邻节点的 next 指针。

二叉树广度优先搜索链表1 种解法
#121

买卖股票的最佳时机

简单

只允许完成一笔先买后卖的交易,求可获得的最大利润。

数组贪心股票1 种解法
#122

买卖股票的最佳时机 II

中等

允许完成任意多笔交易但同一时间最多持有一股,求最大总利润。

数组贪心动态规划2 种解法
#123

买卖股票的最佳时机 III

困难

最多完成两笔交易且同一时间只能持有一股,求最大利润。

数组动态规划状态机1 种解法
#124

二叉树中的最大路径和

困难

寻找二叉树中任意非空简单路径的最大节点值之和,路径不要求经过根节点。

二叉树深度优先搜索后序遍历1 种解法
#131

分割回文串

中等

把字符串切分为若干回文子串,返回所有可能的切分方案。

回溯字符串动态规划1 种解法
#141

环形链表

简单

判断单链表中是否存在沿 next 可重复到达的环。

链表哈希表双指针2 种解法
#142

环形链表 II

中等

若链表有环,返回环的入口节点;否则返回 null。

链表双指针1 种解法
#143

重排链表

中等

把 L0 → L1 → … → Ln 原地重排为 L0 → Ln → L1 → Ln-1 → …,不能只交换节点值。

链表双指针2 种解法
#144

二叉树的前序遍历

简单

按根节点、左子树、右子树的顺序返回节点值。

二叉树深度优先搜索2 种解法
#145

二叉树的后序遍历

简单

按左子树、右子树、根节点的顺序返回节点值。

二叉树深度优先搜索2 种解法
#146

LRU 缓存

中等

实现固定容量的最近最少使用缓存,使 get 与 put 平均 O(1)。

设计哈希表双向链表2 种解法
#148

排序链表

中等

使用适合链表的归并排序,在 O(n log n) 时间内按升序排列节点。

链表归并排序双指针1 种解法
#150

逆波兰表达式求值

中等

计算有效逆波兰表达式,整数除法向零截断。

数组数学1 种解法
#151

反转字符串中的单词

中等

反转单词顺序,并把单词间的任意连续空格规范为一个空格。

字符串双指针2 种解法
#155

最小栈

中等

实现支持 push、pop、top 和 O(1) getMin 的栈。

设计2 种解法
#160

相交链表

简单

按节点引用而非节点值,返回两个单链表开始相交的节点;不相交返回 null。

链表双指针2 种解法
#162

寻找峰值

中等

返回任意一个严格大于左右相邻元素的峰值下标,数组边界外视为负无穷。

数组二分查找2 种解法
#165

比较版本号

中等

逐段比较两个点分十进制版本号,忽略每段前导零和尾部零段。

字符串双指针1 种解法
#188

买卖股票的最佳时机 IV

困难

最多完成 k 笔交易且同一时间只能持有一股,求最大利润。

数组动态规划状态机1 种解法
#198

打家劫舍

简单

在线性房屋中选择互不相邻的房屋,使偷窃金额总和最大。

数组动态规划2 种解法
#199

二叉树的右视图

中等

返回从右侧观察二叉树时每一层可见的节点。

二叉树广度优先搜索深度优先搜索2 种解法
#200

岛屿数量

中等

统计字符网格中由上下左右相邻的陆地 1 组成的岛屿数量。

矩阵深度优先搜索连通分量1 种解法
#202

快乐数

简单

反复把整数替换为各位数字平方和,判断序列最终是否到达 1。

哈希表数学快慢指针2 种解法
#203

移除链表元素

简单

删除单链表中所有值等于 val 的节点并返回新头节点。

链表哨兵节点1 种解法
#206

反转链表

简单

反转单链表的 next 方向并返回新的头节点。

链表递归2 种解法
#209

长度最小的子数组

中等

在正整数数组中寻找元素和至少为 target 的最短连续子数组,不存在时返回 0。

数组滑动窗口前缀和2 种解法
#213

打家劫舍 II

中等

房屋首尾相邻成环,选择互不相邻房屋使金额最大。

数组动态规划1 种解法
#215

数组中的第 K 个最大元素

中等

在未排序数组中返回按降序排列后的第 k 个元素,而不是第 k 个不同元素。

数组快速选择2 种解法
#216

组合总和 III

中等

从 1 到 9 中选择 k 个互不相同的数,使其和等于 n。

回溯组合剪枝1 种解法
#221

最大正方形

中等

在只包含 0 和 1 的字符矩阵中,返回全为 1 的最大正方形面积。

矩阵动态规划1 种解法
#222

完全二叉树的节点个数

简单

统计一棵完全二叉树的节点总数。

完全二叉树深度优先搜索广度优先搜索2 种解法
#225

用队列实现栈

简单

只使用队列的标准操作,实现后进先出的栈接口。

队列设计2 种解法
#226

翻转二叉树

简单

交换二叉树每个节点的左右子树。

二叉树深度优先搜索广度优先搜索2 种解法
#232

用栈实现队列

简单

只使用栈的标准操作,实现先进先出的队列接口。

队列设计1 种解法
#234

回文链表

简单

判断单链表节点值从前向后与从后向前是否相同。

链表双指针快慢指针2 种解法
#235

二叉搜索树的最近公共祖先

中等

在二叉搜索树中寻找两个给定节点的最近公共祖先。

二叉搜索树深度优先搜索路径3 种解法
#236

二叉树的最近公共祖先

中等

在普通二叉树中寻找两个给定节点的最近公共祖先。

二叉树深度优先搜索后序遍历1 种解法
#239

滑动窗口最大值

困难

返回长度为 k 的窗口从左向右滑动时,每个窗口中的最大值。

数组滑动窗口单调队列2 种解法
#240

搜索二维矩阵 II

中等

在每行从左到右、每列从上到下都升序的矩阵中判断 target 是否存在。

数组矩阵二分查找2 种解法
#242

有效的字母异位词

简单

判断两个字符串是否由完全相同的字符及出现次数组成。

哈希表字符串排序3 种解法
#257

二叉树的所有路径

简单

以“->”连接节点值,返回所有根到叶子的路径。

二叉树深度优先搜索字符串1 种解法
#300

最长递增子序列

中等

返回整数数组中严格递增子序列的最大长度,子序列不要求连续。

数组动态规划二分查找1 种解法
#309

买卖股票的最佳时机含冷冻期

中等

交易次数不限,但卖出后的下一天不能买入,求最大利润。

数组动态规划状态机1 种解法
#322

零钱兑换

中等

用给定面额的无限枚硬币凑出 amount,返回所需最少硬币数,无法凑成时返回 -1。

数组动态规划记忆化搜索2 种解法
#332

重新安排行程

困难

从 JFK 出发使用全部机票恰好一次,并返回字典序最小的有效行程。

回溯欧拉路径2 种解法
#337

打家劫舍 III

中等

房屋组成二叉树,父子节点不能同时选择,求最大金额。

二叉树动态规划深度优先搜索2 种解法
#344

反转字符串

简单

原地反转字符数组,不能分配另一份字符数组。

字符串双指针1 种解法
#347

前 K 个高频元素

中等

返回整数数组中出现频率最高的 k 个不同元素,答案顺序不限。

数组哈希表优先队列1 种解法
#349

两个数组的交集

简单

返回两个数组共有的不同元素,结果顺序任意。

数组哈希集合1 种解法
#354

俄罗斯套娃信封问题

困难

每个信封必须在宽和高两个维度都严格小于外层信封,求最多可嵌套数量。

数组排序动态规划1 种解法
#376

摆动序列

中等

从数组中删除若干元素,使相邻差值严格正负交替,求最长摆动子序列长度。

数组贪心动态规划1 种解法
#383

赎金信

简单

判断 ransomNote 能否由 magazine 中的字符组成,每个字符最多使用一次。

哈希表字符串计数1 种解法
#394

字符串解码

中等

将 k[encoded_string] 按重复次数展开,编码可以嵌套且 k 可以有多位。

字符串递归1 种解法
#404

左叶子之和

简单

计算二叉树中所有左叶子节点值的总和。

二叉树深度优先搜索广度优先搜索2 种解法
#415

字符串相加

简单

不把完整输入转换为整数,计算两个非负整数字符串之和。

数学字符串模拟1 种解法
#450

删除二叉搜索树中的节点

中等

删除二叉搜索树中值为 key 的节点,并保持搜索树性质。

二叉搜索树递归迭代2 种解法
#454

四数相加 II

中等

从四个等长数组各选一个元素,统计四数之和为 0 的下标元组数量。

数组哈希表分组1 种解法
#455

分发饼干

简单

每个孩子最多得到一块饼干,在尺寸满足胃口的前提下最大化被满足的孩子数。

贪心排序双指针1 种解法
#459

重复的子字符串

简单

判断非空字符串能否由某个更短子串重复若干次构成。

字符串字符串匹配KMP2 种解法
#463

岛屿的周长

简单

网格中只有一座不含湖泊的岛屿,计算陆地与海洋或边界接触的边数。

矩阵深度优先搜索网格1 种解法
#470

用 Rand7() 实现 Rand10()

中等

只调用等概率返回 1 到 7 的 rand7(),实现等概率返回 1 到 10 的 rand10()。

数学拒绝采样随机化1 种解法
#491

非递减子序列

中等

找出数组中所有长度至少为 2 的不同非递减子序列,同时保持原下标顺序。

回溯数组子序列1 种解法
#513

找树左下角的值

中等

返回二叉树最深一层最左侧节点的值。

二叉树广度优先搜索1 种解法
#530

二叉搜索树的最小绝对差

简单

返回二叉搜索树任意两个不同节点值之间的最小绝对差。

二叉搜索树中序遍历深度优先搜索1 种解法
#538

把二叉搜索树转换为累加树

中等

把每个节点值改为原树中大于等于该值的所有节点值之和。

二叉搜索树反向中序遍历1 种解法
#541

反转字符串 II

简单

每计数 2k 个字符,反转其中前 k 个;不足 k 个时反转全部剩余字符。

字符串双指针模拟1 种解法
#543

二叉树的直径

简单

返回二叉树任意两节点间最长路径的边数。

二叉树深度优先搜索后序遍历1 种解法
#572

另一棵树的子树

简单

判断 subRoot 是否与 root 的某个节点为根的整棵子树完全相同。

二叉树深度优先搜索1 种解法
#617

合并二叉树

简单

重叠节点值相加,非重叠节点直接保留,得到合并后的树。

二叉树深度优先搜索广度优先搜索2 种解法
#654

最大二叉树

中等

递归选择数组最大值为根,左右子数组分别构造左右子树。

二叉树分治数组1 种解法
#669

修剪二叉搜索树

中等

删除值不在闭区间 [low, high] 内的节点,并保持原节点相对结构。

二叉搜索树递归迭代2 种解法
#695

岛屿的最大面积

中等

在 0/1 网格中按上下左右连接陆地,返回最大岛屿包含的格子数。

矩阵深度优先搜索网格1 种解法
#700

二叉搜索树中的搜索

简单

返回二叉搜索树中值等于目标值的节点及其子树。

二叉搜索树深度优先搜索迭代3 种解法
#701

二叉搜索树中的插入操作

中等

将一个不存在于树中的值插入二叉搜索树并返回根节点。

二叉搜索树递归迭代2 种解法
#704

二分查找

简单

在严格升序数组中查找 target,存在则返回下标,否则返回 -1。

数组二分查找2 种解法
#714

买卖股票的最佳时机含手续费

中等

交易次数不限,每笔完整交易收取一次手续费,求最大利润。

数组动态规划贪心1 种解法
#889

根据前序和后序遍历构造二叉树

中等

根据前序和后序遍历构造任意一棵符合条件的二叉树。

二叉树分治哈希表1 种解法
#904

水果成篮

中等

寻找只包含至多两种值的最长连续子数组,对应两个篮子可采摘的最多水果数。

数组哈希表滑动窗口1 种解法
#912

排序数组

中等

将整数数组按升序原地排序并返回;这里整理旧源码中的随机化快速排序。

数组排序快速排序1 种解法
#977

有序数组的平方

简单

将非递减数组的每个元素平方,并返回仍按非递减顺序排列的数组。

数组双指针排序2 种解法
#1047

删除字符串中的所有相邻重复项

简单

反复删除相邻且相同的两个字符,返回最终稳定字符串。

字符串1 种解法
#1143

最长公共子序列

中等

求两个字符串最长公共子序列的长度,子序列不要求连续。

字符串动态规划1 种解法
#JZ71

跳台阶扩展问题

简单

每次可跳 1 到 n 级,计算跳上 n 级台阶的不同方法数。

动态规划数学牛客2 种解法
#K55

右旋字符串

简单

把字符串最右侧 k 个字符移动到最前面,保持两段内部相对顺序。

字符串双指针卡码网1 种解法
#LCR140

训练计划 II

简单

返回链表倒数第 cnt 个节点;该旧文件对应 LCR 140,而不是 LeetCode 140“单词拆分 II”。

链表双指针1 种解法