news 2026/10/23 19:38:28

力扣Hot 100矩阵题二刷复盘:从坐标建模到边界控制一次讲透

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
力扣Hot 100矩阵题二刷复盘:从坐标建模到边界控制一次讲透

力扣Hot 100这个题单,刷过的人都懂,它基本就是算法面试的"主战场"。矩阵题在里面的地位有点特别:占比不算最高,但几乎每次大厂面试都会撞上那么一两道——旋转图像、螺旋矩阵、矩阵置零、搜索二维矩阵II、岛屿数量,全是Hot 100的常客。我二刷这一块的时候感触特别深,因为第一次刷多半是"照着题解AC了就完事",可一旦换道题、换个输入矩阵,马上露馅,不是索引越界就是忘了原地修改,再不然就是DFS写成了死循环。这篇内容我会把Hot 100里跟矩阵强相关的题重新过一遍,不是简单列代码,而是把每一类题的坐标模型、边界控制、状态标记方法拆开讲透,再把我踩过的坑和排查思路一并整理出来。适合正在按Hot 100系统性刷题、想从"会做"进阶到"会讲"的读者,也适合面试前临时抱佛脚做快速回顾。

1. 先看看Hot 100里到底藏着多少矩阵题

1.1 把矩阵题一张表拎出来

Hot 100清单在不同版本里会有些微调,但经典的矩阵题基本是固定的。以我常看的版本为基础,把跟矩阵强相关的题列出来,大概是这么个阵容:

题号题目核心考点难度
73矩阵置零原地标记、状态压缩中等
54螺旋矩阵模拟遍历、边界收缩中等
48旋转图像数学变换、原地修改中等
240搜索二维矩阵II规律搜索、折线决策中等
200岛屿数量DFS/BFS、连通域计数中等
79单词搜索回溯、visited标记中等
221最大正方形动态规划、递推状态中等

除了这七道"真矩阵题",还有像36有效的数独这样的题也带矩阵外壳,以及若干以矩阵作为数据载体的动态规划题。我的分法是:只要核心解法里"二维坐标的移动、标记、变换"占了主要篇幅,就值得归入矩阵专项来复盘。这样一来,Hot 100里矩阵题的实际覆盖面其实比你印象中的要大。

1.2 为什么矩阵题值得单独拎出来复盘

有人可能会说,矩阵不就是二维数组吗,跟一维数组能差多少?这句话第一次刷的时候我也信了,后来发现矩阵题的难点根本不在"数组"上,而在三件事上:坐标建模、边界控制、原地修改。

先说坐标建模。题干里给的是"矩阵",但具体操作时你要把行列、上下左右、顺时针逆时针这些语义全部翻译成坐标变换。比如旋转90度,本质是坐标映射(i,j)到(j,n-1-i),如果你的坐标系没建立清楚,代码写起来就是一团乱麻。

再说边界控制。螺旋矩阵、DFS、BFS全都要跟边界打交道,而边界bug的特点是:跑测试用例大概率能过,一到特殊输入(单行、单列、空矩阵)就崩。这种问题刷题时暴露得晚,面试时暴露得极其致命。

最后是原地修改。矩阵题像是旋转图像、矩阵置零都明确要求"原地",这就逼你不能随便开新数组,必须在原矩阵上做文章。设计一个不覆盖、不污染后续判断的标记方案,是这类题真正想考的东西。

把这三点单独拎出来练,比零散地混在数组题里刷效率高得多,这也是我决定重走这一块的根本原因。

2. 所有矩阵题的地基:坐标操作和边界感

2.1 坐标系和行列心智模型是第一步

在硬刚任何一道矩阵题之前,先把坐标系在心里焊死:代码里的matrix[i][j],i永远代表行号,对应的是从上到下的第几行;j永远代表列号,对应从左到右的第几列。不要被"x轴、y轴"的惯性带偏,更不要一会儿用row一会儿用rowIndex来代指行,变量名不统一很容易把自己绕晕。

我见过不少初学者(包括当年的我)在旋转图像里栽跟头,根本原因就是把i和j的语义搞混,写交换的时候matrix[i][j]和matrix[j][i]凭空多写一次,又或是在DFS里把"上下左右"的dx、dy对调,结果路径走到飞起。建议拿到题目之后,第一件事就是在草稿纸上画一个3乘4的矩阵,把几个关键坐标标出来,再想想你要做的操作会把这些坐标映射到哪里。坐标模型一旦清晰,后面所有代码都是水到渠成。

2.2 方向数组和边界收缩,两套工具要分清楚

矩阵题里有两套移动工具,用途完全不同。第一套是方向数组,适合那种"小步快跑"的搜索类题目,比如岛屿数量、单词搜索。标准写法是:

DIRS = [(1, 0), (-1, 0), (0, 1), (0, -1)]

每次移动就是ni = i + dx、nj = j + dy,配合越界判断和访问标记使用。方向数组的好处是代码统一,加一个方向只改一行,不用写四段几乎一模一样的递归。

第二套是边界收缩指针,适合螺旋矩阵这种"按圈走"的模拟题。核心思路是维护top/bottom/left/right四个变量,代表当前还没遍历到的矩形边界,每走完一条边就收缩对应的边界:

def spiralOrder(matrix): res = [] if not matrix or not matrix[0]: return res top, bottom = 0, len(matrix) - 1 left, right = 0, len(matrix[0]) - 1 while top <= bottom and left <= right: for j in range(left, right + 1): res.append(matrix[top][j]) top += 1 for i in range(top, bottom + 1): res.append(matrix[i][right]) right -= 1 if top <= bottom: for j in range(right, left - 1, -1): res.append(matrix[bottom][j]) bottom -= 1 if left <= right: for i in range(bottom, top - 1, -1): res.append(matrix[i][left]) left += 1 return res

这两套工具对应两类完全不同的思维模式,搜索类强调"每步判断",模拟类强调"整体收缩"。我在复盘时发现,一旦把题目按这个维度分类,解题思路就清晰了一大半。

2.3 原地修改的三条原则

Hot 100里的矩阵题非常喜欢考原地修改。所谓原地,不是要求你绝对不能用额外变量,而是说额外空间的量级必须是常数级O(1),不能随着矩阵大小增长。

在这个约束下,我总结出三条贯穿所有矩阵题的原则:第一,标记信息必须无损地保存下来,要么用不会影响后续判断的特殊值,要么用原矩阵本身的空间偷标记;第二,遍历和修改必须分离,不能在遍历的过程中立刻修改那些后续还会被读到的格子;第三,分阶段执行,先通过两三轮独立扫描把信息记录完整,再统一做修改。后面矩阵置零和旋转图像的具体做法,本质都是对这三条原则的落地。

3. 四大核心题型复盘:从思维到代码一次打通

3.1 原地变换类:旋转图像与矩阵置零

旋转图像这题,题目要求顺时针旋转90度且原地完成。最朴素的想法是开一个新矩阵,把matrix[i][j]填到新位置(j, n-1-i),但这不满足原地要求。

于是要换个思路:把顺时针90度拆成两个连续操作——先转置,再左右翻转。为什么这样拆?因为转置是原地好操作的对称交换,左右翻转也只需要逐行reverse,两步合起来正好等价于旋转。代码如下:

def rotate(matrix): n = len(matrix) for i in range(n): for j in range(i, n): matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j] for i in range(n): matrix[i].reverse()

内层循环里的range(i, n)是我刻意提醒自己的点:转置交换只需要遍历对角线一侧,写range(n)会导致每个元素被交换两次,等于白做。这套"拆解变换"的思维比死记代码更重要,逆时针90度就是先转置再上下翻转,180度就是上下翻转加左右翻转,举一反三靠的就是这个坐标映射模型。

矩阵置零是另一个典型。题目要求:如果某个格子是0,把它所在行和列的所有格子都置为0。最简单的做法是开两个集合分别记录需要清零的行和列,空间O(m+n);再进阶一步,利用第一行和第一列本身作为标记区,把空间压到O(1):

def setZeroes(matrix): m, n = len(matrix), len(matrix[0]) first_row_zero = any(matrix[0][j] == 0 for j in range(n)) first_col_zero = any(matrix[i][0] == 0 for i in range(m)) for i in range(1, m): for j in range(1, n): if matrix[i][j] == 0: matrix[i][0] = 0 matrix[0][j] = 0 for i in range(1, m): for j in range(1, n): if matrix[i][0] == 0 or matrix[0][j] == 0: matrix[i][j] = 0 if first_row_zero: for j in range(n): matrix[0][j] = 0 if first_col_zero: for i in range(m): matrix[i][0] = 0

这里最关键的坑是matrix[0][0]的位置。它同时属于第一行和第一列,如果直接拿它当标记,你无法区分是第一行需要清零、第一列需要清零还是两者都需要。所以必须先把"第一行本身是否有0"和"第一列本身是否有0"分别记录到布尔变量里,最后单独处理。这个细节我第一次刷的时候漏掉了,导致一个全零矩阵的用例直接翻车。

3.2 模拟遍历类:螺旋矩阵与它的表亲

螺旋矩阵的核心理解点在于:它不是一个固定方向的周期性移动,而是一个"撞墙就转"的边界收缩过程。所以用方向数组配合方向切换也能做,但维护状态量大;最干净的方式还是我上面写的四边界收缩法。

这题常见的失误是漏掉两个if判断。当一个矩阵只剩一行或一列时,向右走完、向下走完,此时top已经大于bottom或right已经小于left,如果再继续执行"从右到左"或"从下到上",就会把已经遍历过的元素重复加进结果。所以每次横向或纵向移动之后都要检查收缩后的边界是否仍然有效。

螺旋矩阵有个亲兄弟叫生成螺旋矩阵(力扣59题),要求反过来填充一个n乘n的矩阵。思维完全一致,只不过把"读取"换成"写入"。我建议刷完54题之后立刻做一遍59题,同一套边界收缩模型双向使用,能帮你把这个模型焊死在脑子里。

还有一个值得练的表亲是"对角线遍历"类题目,比如按对角线顺序输出矩阵元素。这类题的坐标规律是同一条对角线上i+j为常数,掌握了这个恒定关系,问题就变成了对常数的枚举和边界控制,本质上仍然是坐标建模能力的考察。

3.3 搜索类:搜索二维矩阵II的折线决策

搜索二维矩阵II的题干是每行从左到右升序、每列从上到下升序,目标是在这个矩阵里找target。这题最优雅的解法是利用右上角(或左下角)作为"决策点",做折线搜索:

def searchMatrix(matrix, target): m, n = len(matrix), len(matrix[0]) i, j = 0, n - 1 while i < m and j >= 0: if matrix[i][j] == target: return True elif matrix[i][j] > target: j -= 1 else: i += 1 return False

为什么偏偏选右上角?因为matrix[0][n-1]有一个非常好的性质:它这一行的最大值、这一列的最小值。拿它跟target比较,如果它大于target,说明target不可能在这一列里,整列排除;如果它小于target,说明target不可能在这一行里,整行排除。这样一来每走一步就排除一整行或一整列,最坏情况走到左下角,复杂度是稳定的O(m+n),且不需要额外空间。

我复盘时的一个心得是:这题的思维方式跟二分查找有共通之处,都是"利用有序性快速缩小搜索区域",但它的区域缩小是二维的、行列两个方向交替进行,这种"折线决策"模型在后续很多二维搜索题里都能复用。如果题目改成"每行升序且每行第一个数大于前一行最后一个数"的严格递增矩阵,那就是另一道题——74题搜索二维矩阵,可以直接把二维映射成一维做二分,那个模型和这道题的适用场景不要搞混。

3.4 连通域类:岛屿数量与单词搜索

岛屿数量是非常经典的DFS连通域计数题。核心思想很简单:遍历矩阵,碰到'1'就把计数器加一,然后从这个格子出发,把所有相邻的'1'全部"沉掉"(改成'0'),避免后续重复计数:

def numIslands(grid): m, n = len(grid), len(grid[0]) def dfs(i, j): if i < 0 or i >= m or j < 0 or j >= n or grid[i][j] != '1': return grid[i][j] = '0' dfs(i + 1, j) dfs(i - 1, j) dfs(i, j + 1) dfs(i, j - 1) count = 0 for i in range(m): for j in range(n): if grid[i][j] == '1': count += 1 dfs(i, j) return count

这里我用了"沉岛"策略而不是单独的visited数组。两者的区别在于:沉岛直接修改原矩阵,空间O(1);visited数组需要一个同样大小的布尔矩阵,空间O(mn)。面试时优先沉岛,但要注意题目允不允许修改原数组,如果不允许就只能用visited。

岛屿数量的坑主要在递归深度上。力扣的测试用例里可能会出现几百乘几百的大网格,Python默认递归深度是1000,DFS一旦深入超过这个阈值就会报RecursionError。保险做法是开头写上sys.setrecursionlimit(10**6),或者干脆用栈模拟递归、改用BFS。我自己的习惯是:能改迭代就改迭代,面试时当面写递归加setrecursionlimit,大多数面试官是接受的。

单词搜索这题可以看作是DFS的进阶版,多了回溯。区别在于:走到死路时需要撤销刚才的标记,让其他路径还能经过该格子。所以要么额外维护visited并在递归返回时重置为False,要么原地把格子改成特殊字符'#'、递归返回时再改回来。很多人在"回溯撤销"这一步丢分,记住一句话:凡是"找一条可行路径"的DFS,几乎都要回溯;凡是"淹没式连通域"的DFS,几乎都不需要回溯。分清这两类,你就不会被visited的管理方式绕晕。

4. 从Hot矩阵题延伸出去的变体和进阶方向

4.1 换皮变体:改条件、改方向、改目标

矩阵题最大的价值在于变体极其丰富,面试官随便改一个条件就能造出"新题"。我按Hot 100里的原题整理了一些典型的变体方向,平时可以用来做自我检测。

旋转相关的变体有逆时针旋转、旋转90度后再平移、根据中心点旋转带小数坐标(这种一般不会在面试里出纯模拟,太繁琐)。螺旋类的变体有从任意位置开始螺旋、蛇形遍历、按圈从外到内填充。搜索类的变体有"每行升序但列不升序"的近似有序矩阵、"查找第k小的数"(有序矩阵中第K小的元素,力扣378题)。连通域类的变体有"岛屿的最大面积"、"被围绕的区域"(力扣130题)、"不同岛屿的数量"。

我建议的练习方式是:每做完一道Hot原题,就主动给自己加两个变体条件,比如把顺时针改成逆时针、把找是否存在改成找数量、把单一入口改成多入口。这样做不是为了压中题,而是为了验证你是否真的掌握了模型,而不是背住了一篇题解。变体题通常能在原题基础上改五行代码就通过,一旦发现改不动,说明坐标系或边界控制还有漏洞。

4.2 矩阵论的数学延伸:快速幂、特征值和转置优化

Hot 100里没有矩阵快速幂,但这个知识点在"矩阵"这个大的技术关键词下被高频提及,我觉得值得花一点篇幅聊聊它的定位。

矩阵快速幂的核心用途是解决线性递推问题,最经典的场景是斐波那契数列。把递推关系写成矩阵乘法的形式,然后用快速幂在O(logn)时间内求出第n项,比动态规划O(n)快一个量级。这个能力的门槛不高,但需要你先把矩阵乘法写熟,再理解"状态转移矩阵"的概念。刷完Hot 100的矩阵题后,有余力的话这个方向是很好的进阶选择。

至于特征值分解、正规矩阵、分块矩阵求逆这些,属于比较"硬核"的数学内容,在算法面试里出现概率很低,更常见于数据科学、计算机图形学或者强化学习的场景中。我的建议是了解概念即可,不需要投入大量时间去啃,性价比真的不高。抛开数学概念,工程里更实用的是矩阵转置和矩阵乘法的优化——比如C/C++里优化矩阵转置可以用分块策略来提升缓存命中率,Python里则要尽量避免频繁按列访问二维列表,因为list of list按行存储,列访问会产生较大的内存跳跃,性能远低于行访问。这些细节在刷题时体现不出来,但做现实工程项目时就是几倍到几十倍的性能差距。

4.3 一个容易被忽略的视角:矩阵里的状态机

如果把矩阵的每个格子看作一个状态,把"移动"看作是状态转移,那么很多题目都可以统一到一个框架下:你在一个二维状态空间里做搜索或递推。岛屿数量是状态转移图上的连通域计数,搜索二维矩阵II是在有向图上的贪心游走,螺旋矩阵是对状态空间的确定性遍历,动态规划类矩阵题则是按照某种拓扑序做状态转移。

这个视角有什么用?它能帮你把看似不同的题归到同一套分析流程里:先定义状态(格子是什么含义),再定义转移(移动规则是什么),再定义终态(答案在哪里)。我复盘Hot 100时感受最深的一点就是,一旦把矩阵题当状态机来理解,解题就不再是背套路,而是在"设计状态转移过程",这是完全不同的境界。

5. 二刷排雷实录:这些坑我替你踩过了

5.1 索引与边界:最阴损的一类错误

矩阵题的边界bug非常阴损,因为常规用例根本触发不了,只有单行、单列、两行的矩形才会暴露。我整理了三类最常踩的坑,全部真实发生过。

第一类是m和n混用。二维矩阵的行数是len(matrix),列数是len(matrix[0]),写循环时一会儿用m一会儿用n,某个矩阵不是正方形就直接IndexError。我的习惯是把m、n在函数开头显式定义出来,所有循环都用命名变量,不直接写len。

第二类是循环边界符号的问题。搜索方向数组时,常见错误是把i >= 0写成i > 0,导致最后一行或最后一列永远扫不到;螺旋矩阵里则容易把range(right, left - 1, -1)写成range(right, left, -1),多走一格直接越界。这类问题靠调试很难看出来,最好的办法是专门准备三个极小用例:1乘1、1乘n、m乘1,写完后先用它们跑一遍再提交。

第三类是死循环。DFS里忘记标记已访问,或者回溯时撤销了不该撤销的标记,都会导致无限递归或无限循环。调试这种问题,我一般会在递归入口打印(i,j),一旦发现同一个坐标反复出现,立刻检查visited的更新时机。

5.2 原地修改:数据覆盖是一场灾难

原地修改的坑比边界更隐蔽。矩阵置零里,如果在第一遍扫描时就立刻把整个行和列置成0,后续扫描读到这些被改出来的0,就会把根本没出现过0的行列也置成0,结果整个矩阵全变成0。正确做法是先扫描、后统一执行置零,这也是"两阶段法"的意义所在。

旋转图像的坑在交换上。matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]看起来很简单,但如果你手写三步交换,中间少存了一个临时变量,某个值就会被覆盖掉。而且因为是在同一个矩阵里操作,覆盖痕迹非常隐蔽,打印一百遍也不容易定位。我的建议是:凡是这种对称交换,尽量用Python的多变量交换语法,或者明确写出tmp变量,不要省。

单词搜索的回溯坑则是"忘记恢复"。DFS递归前把grid[i][j]改成'#',递归返回后如果没改回原字符,那么这条路径走过的地方就被永久封锁了,后面无论怎么尝试都会错过正确路径。排查这类问题,盯住"每次递归返回后的状态是否与进入前一致"。

5.3 复杂度分析:别写出伪O(1)

矩阵题面试必问复杂度,最容易翻车的有两个地方。一是声称原地但实际用了新数组,比如有些人嘴上说O(1)空间,代码里却new了一个m乘n的visited矩阵,这是面试官一眼就能看穿的。二是时间复杂度的表达,搜索二维矩阵II把每个格子都扫一遍的话是O(mn),但用右上角折线法可以达到O(m+n),这两者在面试评价里完全是两个档次,如果你跟面试官说"我这道题是O(n)的优化版",要能说清楚优化点在哪、为什么成立。

我复盘时给自己定了一个底线:每道题AC之后,必须把时间复杂度和空间复杂度写下来,并且写成注释放在代码头部。这个动作看似形式主义,但在面试高压环境下能保证你随时讲得清,不会卡壳。

6. 重走之后的刷题路线建议

6.1 按难度分三轮,把Hot矩阵题吃透

我的建议是把矩阵题分成三轮来刷。第一轮只求AC,可以看题解,但每道题看完之后必须关掉题解手写一遍,防止"眼睛会了手不会"。第二轮卡时间限时,给自己30分钟,不管做得出做不出都要独立写完全套代码,做不出来可以事后补,但过程中不许翻题解。第三轮做变体训练,把矩阵置零改成一遇到0就把对角线也置零,把螺旋矩阵改成蛇形走位,把岛屿数量改成计算周长,逼自己在原代码上做增量调整。

这个三轮法的核心逻辑是:第一轮解决"没思路",第二轮解决"写不对",第三轮解决"不会变通"。如果你时间紧张,二刷时可以直接从第二轮开始,因为第一轮的记忆还没完全消退,反而是最容易被错觉欺骗的阶段。

6.2 用输出倒逼理解:给每道题写"一分钟讲稿"

我二刷Hot 100时做了一件非常有价值的事:为每道矩阵题写一段一分钟讲稿,内容是"题目里给了什么条件、我选择什么模型、如何建模、复杂度是多少、最容易错在哪"。写完不一定给别人看,但每写一遍,那道题的框架就会在脑子里更清晰一截。

这个方法特别适合面试前的模拟。你可以找一个同样在刷题的朋友互考,也可以自己对着录音讲一遍再回放,相信我,你会发现自己讲得乱七八糟的地方,恰恰就是你理解最薄弱的地方。矩阵题尤其适合这种方式,因为它的逻辑链路长:从坐标到模型到实现到边界,任何一环含糊,一开口就露馅。

6.3 整理一张"套路卡"随身带

最后分享一个小习惯。把矩阵题的核心套路压缩成一张卡片,内容大概是一页纸的三列清单:题目类型、核心模型、易错点。比如原变换类对应"坐标映射+拆解操作",模拟类对应"四边界收缩+收缩后检查",搜索类对应"决策点+行列排除",连通域类对应"沉岛/回溯+深度控制"。面试前几分钟翻一遍这张卡,比临时刷题管用得多。它不会给你答案,但能在最短时间内唤醒你的坐标系和边界感,而这两个东西一旦醒了,矩阵题基本就稳了。

我个人在重走这一轮之后最大的体会是:矩阵题练的压根不是"二维数组语法",而是把真实世界里的旋转、移动、搜索、覆盖这些动作抽象成坐标和状态变化的能力。Hot 100给的是一套很好的训练样例,但真正的收获是你脑子里那套"坐标-状态-边界"的三元思维模型。带着这套模型去面哪怕完全没见过的矩阵新题,你也会有底气说出"这题本质上是XX模型,我这样建模、这样转移、这样处理边界"。等到那一刻,你就不需要再重走任何一份题单了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 14:02:29

SpringBoot+Vue校园视频平台:从零搭建到答辩全指南

1. 校园视频平台&#xff0c;毕设选它到底值不值每年毕业设计选题季&#xff0c;我都会被问到同一个问题&#xff1a;“学长&#xff0c;我想做个视频平台&#xff0c;用Spring Boot加Vue行不行&#xff1f;”我的回答通常很直接&#xff1a;行&#xff0c;而且这个组合非常稳。…

作者头像 李华
网站建设 2026/10/19 16:10:32

Java实现PDF表格提取:Tabula+POI无缝转Excel/CSV实战

1. 需求拆解&#xff1a;为什么“PDF 转表格”总是翻车先说个现实&#xff1a;很多 Java 工程师一碰到 PDF 表格提取就头大。PDF 这格式天生就不是给人编辑的&#xff0c;它保存的是“坐标和图形”&#xff0c;不是“行和列”。你用鼠标在 PDF 里看着是整整齐齐的表格&#xff…

作者头像 李华
网站建设 2026/10/20 9:12:06

农产品网站毕业设计实战:Spring Boot+Vue前后端分离开发与部署指南

简介&#xff1a;这份资源是面向Java Web方向毕业设计与课程设计场景的农产品电商网站完整源码包&#xff0c;适合需要独立完成购物类系统开发的学生或初级开发者参考。项目采用Java语言与JDK1.8开发&#xff0c;数据库选用MySQL 5.7及以上并配合Navicat管理&#xff0c;可在ec…

作者头像 李华
网站建设 2026/10/22 18:00:12

深入理解以太坊交易树与收据树:从MPT结构到实战验证

搞懂以太坊的交易树和收据树&#xff0c;你就看懂了半个区块老实说&#xff0c;在ETH的各类数据结构里&#xff0c;交易树&#xff08;Transaction Trie&#xff09;和收据树&#xff08;Receipt Trie&#xff09;是最容易被一笔带过、又最值得花时间吃透的东西。你日常查转账记…

作者头像 李华
网站建设 2026/10/21 6:11:14

WebSocket流式聊天:从零接入DeepSeek大模型的完整指南

简介&#xff1a;在AI应用开发中&#xff0c;实时交互逐渐成为标配。如何将大模型生成的内容以流式方式推送到前端&#xff0c;直接影响用户体验的流畅度。基于HTTP轮询或一次性返回的常规方案&#xff0c;在长文本生成场景下往往延迟偏高、交互生硬&#xff0c;而WebSocket凭借…

作者头像 李华