题目重点:每组由九个格子的最小值代表;含1可判无效。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 代码支持tiled=True从(0,0)按3步长分完整块,False遍历所有重叠3×3窗口。实际分组步长未给。
- 忽略不完整边缘;无效规则reject_one=True;返回(minValue,topRow,leftCol),同值按位置选最先。
解题路线
- 对每候选九格求min,若含1且无效规则开启就跳过。九格是常数,扫描复杂度仍与格子数线性。
- 全局答案取候选代表值的最小值,不能误求“九格和最小”或“组内最大最小”。如果最小值是1且全部候选都无效,应返回None。
- 窗口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²格?
