You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python查找矩阵最大热点?DFS实现遇计数问题求助

最大热点问题:DFS计数错误修复方案

你代码里的几个关键问题

  1. 类型不匹配:输入矩阵里的元素是整数1和0,但代码里一直在判断字符串"1"、"0",根本触发不了DFS逻辑,所以count始终为0,tmp列表自然为空。
  2. 递归参数坑:Python里整数是不可变类型,把count传给evap函数后,函数内的cnt +=1不会改变外部的count值;而且递归调用evap时还忘了传cnt参数,完全没法累计计数。
  3. 返回值逻辑错误:sum(max(tmp))完全是错的,要返回最大热点的大小,直接取tmp的最大值即可,sum是多余操作。
  4. 参数注解错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:10:30