1. 问题背景与核心定义
这个问题乍看简单,实则暗藏不少细节陷阱。想象你面前有一张由数字组成的网格纸,我们需要在这张纸上找出所有可能的"菱形"图案,计算它们边缘数字的总和,最后选出最大的三个不同的和值。
菱形在矩阵中的精确定义:可以理解为一个正方形旋转45度后的形状,四个顶点必须正好落在矩阵的交叉点上。比如一个边长为2的菱形,在矩阵中会占据5个格子(中心点和四个顶点),但我们只需要计算边缘四个点的值之和。
这里有几个关键细节需要注意:
- 菱形可以是单个格子(边长为0),此时其和就是格子自身的值
- 计算的是边缘所有格子的和,包括四个顶点
- 不能重复计算顶点(之前暴力解法出错的主要原因)
- 最终结果需要去重并排序
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 暴力解法思路与实现
2.1 基本算法框架
最直观的解法就是暴力枚举所有可能的菱形,然后计算每个菱形的边缘和。具体步骤如下:
- 遍历矩阵中的每一个点作为菱形的中心点
- 对于每个中心点,尝试所有可能的菱形半径(从0开始扩大)
- 对于每个半径,检查四个顶点是否都在矩阵范围内
- 如果在范围内,则计算这个菱形的边缘和
- 将所有和值存入集合去重,然后排序取前三大
2.2 边界条件处理
这里有几个边界情况需要特别注意:
- 单个格子的情况(半径=0)
- 矩阵边缘的点作为中心时,能形成的菱形半径受限
- 顶点坐标计算时的正负号容易出错
- 避免重复计算顶点值(之前版本的主要bug)
2.3 Python实现代码
python复制def getBiggestThree(grid):
m, n = len(grid), len(grid[0])
sums = set()
for i in range(m):
for j in range(n):
# 半径从0开始,最大半径受限于矩阵边界
max_r = min(i, j, m-1-i, n-1-j)
for r in range(0, max_r+1):
if r == 0:
sums.add(grid[i][j])
