知其然,知其所以然
算法与数据结构 2026-09-24

LeetCode 51. N 皇后

把 n 个皇后放到 n × n 的棋盘上,使任意两个皇后都不在同一行、同一列、同一条对角线上,返回所有不同的摆法(每种摆法用 n 个字符串表示棋盘,`Q` 是皇后,`.` 是空位)。做法是回溯:一行放一个皇后,逐行往下放,每放一个之前检查它所在的列和两条对角线有没有被占。判断对角

LeetCode 算法 动画演示
算法与数据结构 2026-09-24

LeetCode 52. N 皇后 II

上一题要求列出所有摆法,这一题只要求数出有多少种。既然不需要保存每种摆法,就可以把"哪些列、哪些对角线被占"压缩成三个整数位掩码:一位对应一列。每往下一行,两条对角线的影响各移动一位:`\` 方向的掩码左移一位,`/` 方向的右移一位。"当前行能放的位置"就是三个掩码的并集取反,

LeetCode 算法 动画演示
算法与数据结构 2026-09-24

LeetCode 53. 最大子数组和

给定一个整数数组(至少一个元素),找出和最大的连续子数组,返回这个最大和。暴力枚举所有子数组是 O(n²)(用累加求和避免第三层循环)。Kadane 算法只扫描一遍:维护"以当前元素结尾的最大子数组和" `cur`,遇到下一个元素 `x` 时,要么把它接在前面那段后面(`cur

LeetCode 算法 动画演示
算法与数据结构 2026-09-24

LeetCode 54. 螺旋矩阵

给定一个 m × n 的矩阵,按顺时针螺旋的顺序返回所有元素:先走最上面一行从左到右,再走最右边一列从上到下,再走最下面一行从右到左,再走最左边一列从下到上,然后向里缩一圈,重复。这道题没有算法上的窍门,难点是边界:当剩下的区域只有一行或一列时,"下边"和"左边"会重复走已经走过

LeetCode 算法 动画演示
算法与数据结构 2026-09-24

LeetCode 55. 跳跃游戏

给定一个非负整数数组,你站在下标 0,每个元素表示从这个位置最多能向前跳的步数,问能否到达最后一个位置。动态规划是 O(n²):逐个位置推出能到的所有位置。贪心是 O(n):从左到右扫描,只维护"目前能到达的最远位置" `farthest`;如果扫描到的位置 `i` 已经超过 `

LeetCode 算法 动画演示
算法与数据结构 2026-09-24

LeetCode 56. 合并区间

给定若干个闭区间 `[起点, 终点]`,把所有有重叠的区间合并,返回合并之后互不重叠的区间。端点相接(例如 `[1, 4]` 和 `[4, 5]`)也算重叠,要合并。标准做法是先按起点排序,这样能合并的区间一定挨在一起,然后扫描一遍:当前区间的起点不超过上一个合并区间的终点,就合

LeetCode 算法 动画演示
算法与数据结构 2026-09-24

LeetCode 57. 插入区间

给定一个已经按起点排好序、互不重叠的区间列表,再插入一个新区间,必要时合并,返回仍然有序且互不重叠的列表。因为原列表已经有序,不需要重新排序,一遍扫描就够:先把完全在新区间左边的区间原样保留;再把与新区间有重叠的全部合并进新区间;最后把完全在新区间右边的原样保留。本文用真实数据展

LeetCode 算法 动画演示
算法与数据结构 2026-09-24

LeetCode 58. 最后一个单词的长度

给定一个由单词和空格组成的字符串,返回最后一个单词的长度。单词是只含字母、被空格分隔的字符串,并且字符串开头和结尾都可能有多余的空格。最直观的写法是按空格切分再取最后一段,但这里有一个陷阱:结尾有空格时,按单个空格切分会得到一个空字符串。更好的做法是从字符串末尾往回扫:先跳过结尾

LeetCode 算法 动画演示
算法与数据结构 2026-09-24

LeetCode 59. 螺旋矩阵 II

给定正整数 n,生成一个 n × n 的矩阵,把 1 到 n² 按顺时针螺旋的顺序依次填进去。这是第 54 题"螺旋矩阵"的反向:那一题是按螺旋顺序读出,这一题是按螺旋顺序写入。同样可以用四条边界一圈一圈往里收缩。本文实测两种不同的实现(逐圈填充与"方向加碰壁右转"的模拟),并且

LeetCode 算法 动画演示
算法与数据结构 2026-09-24

LeetCode 60. 第 k 个排列

给定 n 和 k,返回 1 到 n 的所有排列按字典序排好后的第 k 个。最直接的做法是生成所有排列再取第 k 个,但排列个数是 n!,n = 9 时是 362880 个,只为了一个答案很浪费。更好的做法利用了排列的结构:以 1 开头的排列有 (n-1)! 个,以 2 开头的接着

LeetCode 算法 动画演示
算法与数据结构 2026-09-24

LeetCode 61. 旋转链表

给定一个链表的头结点和整数 k,把链表向右旋转 k 个位置:每旋转一位,最后一个结点移到最前面。k 可能远大于链表长度(题目允许到 20 亿),所以先要意识到旋转 n 次(n 是链表长度)等于没转,k 只需要对 n 取模。做法是:走一遍数出长度并找到尾结点;把尾结点接到头结点上成

LeetCode 算法 动画演示
算法与数据结构 2026-09-24

LeetCode 62. 不同路径

机器人在 m × n 网格的左上角,每次只能向右或向下走一格,问走到右下角一共有多少条不同的路径。这是动态规划的入门题:走到 (i, j) 的路径数,等于走到它上面那一格的路径数加上走到它左边那一格的路径数;第一行和第一列每格只有一条路。这道题还有一个数学解:一共要走 m + n

LeetCode 算法 动画演示
京ICP备2026067502号-1京公网安备11010502063487号