如何用Python查找矩阵最大热点?DFS实现遇计数问题求助
最大热点问题:DFS计数错误修复方案
你代码里的几个关键问题
- 类型不匹配:输入矩阵里的元素是整数
1和0,但代码里一直在判断字符串"1"、"0",根本触发不了DFS逻辑,所以count始终为0,tmp列表自然为空。 - 递归参数坑:Python里整数是不可变类型,把
count传给evap函数后,函数内的cnt +=1不会改变外部的count值;而且递归调用evap时还忘了传cnt参数,完全没法累计计数。 - 返回值逻辑错误:
sum(max(tmp))完全是错的,要返回最大热点的大小,直接取tmp的最大值即可,sum是多余操作。 - 参数注解错误:
area: List[int]应该写成List[List[int]],毕竟输入是二维矩阵。
修正后的代码
from typing import List class Solution: def hotSpots(self, area: List[List[int]]) -> int: def evap(r: int, c: int) -> int: # 越界或当前不是1,直接返回0 if r < 0 or c < 0 or r >= len(area) or c >= len(area[0]) or area[r][c] != 1: return 0 # 标记为已访问(蒸发) area[r][c] = 0 # 递归统计当前单元格+四个方向的连通数量,累加得到当前热点大小 return 1 + evap(r, c+1) + evap(r, c-1) + evap(r+1, c) + evap(r-1, c) max_size = 0 for i in range(len(area)): for j in range(len(area[0])): if area[i][j] == 1: current_size = evap(i, j) # 实时更新最大热点大小 if current_size > max_size: max_size = current_size return max_size
关键优化说明
- 让递归返回计数:不再费劲传递可变参数,直接让
evap函数返回当前连通区域的大小。每次递归返回1(当前单元格)加上四个方向的递归结果,自然累计出整个热点的大小,逻辑简单直接。 - 匹配类型判断:用整数
1/0做判断,和输入矩阵的元素类型对应,不会出现找不到1的情况。 - 高效省内存:不用维护
tmp列表,遍历过程中直接比较更新最大值,既节省内存又减少后续取最大值的操作。 - 边界处理清晰:越界或已被标记的单元格直接返回0,不干扰计数逻辑。
测试验证
用你提供的第一个示例矩阵测试:
areamap = [[1, 0, 0, 0], [1, 1, 1, 0], [0, 0, 0, 1], [1, 1, 1, 1]] sol = Solution() print(sol.hotSpots(areamap)) # 输出5(右下角的连通区域大小为5)
第二个示例矩阵测试:
areamap = [[0, 0, 0, 0], [0, 1, 1, 0], [0, 0, 0, 0], [1, 0, 0, 0]] print(sol.hotSpots(areamap)) # 输出2(中间的连通区域大小为2)
内容的提问来源于stack exchange,提问作者user11192253
相关产品推荐
相关产品推荐

