SWE · Coding

3×3分组最小值:固定分块与滑动窗口分别验证

每组由九个格子的最小值代表;含1可判无效。

题目重点:每组由九个格子的最小值代表;含1可判无效。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 代码支持tiled=True从(0,0)按3步长分完整块,False遍历所有重叠3×3窗口。实际分组步长未给。
  • 忽略不完整边缘;无效规则reject_one=True;返回(minValue,topRow,leftCol),同值按位置选最先。

解题路线

  1. 对每候选九格求min,若含1且无效规则开启就跳过。九格是常数,扫描复杂度仍与格子数线性。
  2. 全局答案取候选代表值的最小值,不能误求“九格和最小”或“组内最大最小”。如果最小值是1且全部候选都无效,应返回None。
  3. 窗口3固定时不用复杂heap。若推广W×W滑动min且W大,可二维单调队列;无效格存在性用前缀和辅助,但这里会增加不必要状态。

手动走一遍

全矩阵1时无效版没有答案;合法版每组代表1。4×4矩阵tiled只有左上3×3,滑动有4个窗口,因此边缘小值可能使两个合同答案不同。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

def minimum_group(matrix,tiled=True,reject_one=False):
    if not matrix:return None
    width=len(matrix[0])
    if any(len(row)!=width for row in matrix):raise ValueError("ragged matrix")
    stride=3 if tiled else 1;answer=None
    for r in range(0,len(matrix)-2,stride):
        for c in range(0,width-2,stride):
            values=[matrix[i][j] for i in range(r,r+3) for j in range(c,c+3)]
            if reject_one and 1 in values:continue
            candidate=(min(values),r,c)
            if answer is None or candidate<answer:answer=candidate
    return answer

复杂度

R×C固定3窗口O(RC)时间,示例每组九项O(1)辅助空间;输入矩阵不计。

易错点与追问

容易失分的边界

  • 步长猜成1或3会改变题目,必须说明。
  • 初始答案0会在全部正数矩阵得到不存在的组。

继续深挖

  • 若不完整边缘也成组,返回位置与代表规则怎样定义?
  • 组大小可变时怎样做二维滑动min而不枚举W²格?
✓已复制微信号!