LC 1878. 矩阵中最大的三个菱形和
https://leetcode-cn.com/problems/get-biggest-three-rhombus-sums-in-a-grid/
这题关键就在于如何快速计算菱形上覆盖的点的和,可以拆分成为几个部分看:
- 假设最上方点为(i, j), 变长为k, 那么最下方点就是(i+2k, j)
- 侧面点分别是(i+k, j-k)和(i+k, j+k).
- 我们可以统计上面三角形部分覆盖的点的值,记为up[(i, j, k)],同样可以计算下面三角形部分值,记为 down[(i, j, k)]
- 那么整个菱形覆盖的点的和就就是 up[(i, j, k)] + down[(i+2k, j, k-1)]
- k=0需要单独进行计算。代码不是特别多,但是写起来需要非常仔细。
class Solution: def getBiggestThree(self, grid: List[List[int]]) -> List[int]: n, m = len(grid), len(grid[0]) values = [] up, down = {}, {} for i in range(n): for j in range(m): v = grid[i][j] up[(i,j,0)] = v down[(i, j, 0)] = v k = 1 while True: l, r = j-k,j+k if (i+k) >=n or l < 0 or r >= m: break v += grid[i+k][l] + grid[i+k][r] up[(i, j, k)] = v k += 1 k = 1 v = grid[i][j] while True: l, r = j-k,j+k if (i-k) <0 or l < 0 or r >= m: break v += grid[i-k][l] + grid[i-k][r] down[(i, j, k)] = v k += 1 for i in range(n): for j in range(m): values.append(grid[i][j]) k = 1 while True: i2 = i + 2 * k l, r = j-k, j+k if i2 >=n or l < 0 or r >= m:break a = up[(i, j, k)] b = down[(i2, j, k-1)] values.append(a+b) k += 1 values = list(set(values)) values.sort(reverse = True) return values[:3]