Leetcode刷题Python之3242.设计相邻元素求和服务
提示:题目不难,细心读题。
文章目录
- 一、题目描述
- 示例
- 二、解题思路
- 三、代码实现
- 代码解析
- 总结
一、题目描述
给你一个 n x n 的二维数组 grid,它包含范围 [0, n2 - 1] 内的不重复元素。
实现 neighborSum 类:
1.neighborSum(int [ ][ ]grid) 初始化对象。
2.int adjacentSum(int value) 返回在 grid 中与 value 相邻的元素之和,相邻指的是与 value 在上、左、右或下的元素。
3.int diagonalSum(int value) 返回在 grid 中与 value 对角线相邻的元素之和,对角线相邻指的是与 value 在左上、右上、左下或右下的元素。
示例
grid = [[0, 1, 2],[3, 4, 5],[6, 7, 8]
]
obj = NeighborSum(grid)
print(obj.adjacentSum(1)) # 输出: 6
print(obj.adjacentSum(4)) # 输出: 16
print(obj.diagonalSum(4)) # 输出: 16
print(obj.diagonalSum(8)) # 输出: 4
grid = [[1, 2, 0, 3],[4, 7, 15, 6],[8, 9, 10, 11],[12, 13, 14, 5]
]
obj = NeighborSum(grid)
print(obj.adjacentSum(15)) # 输出: 23
print(obj.diagonalSum(9)) # 输出: 45
二、解题思路
要实现这个类,我们首先需要解决两个核心问题:
1.如何找到指定元素的坐标位置:由于数组中的元素都是不重复的整数,我们可以在初始化时创建一个哈希表(字典),将每个元素的值映射到它在二维数组中的坐标位置,以实现快速查找。
2.如何计算相邻元素和对角线相邻元素之和:根据题意,相邻方向包括上下左右四个方向,对角线方向则包括左上、右上、左下、右下四个方向。我们可以利用这些方向的坐标偏移量来判断坐标边界,从而计算元素的相邻元素和对角线相邻元素之和。
三、代码实现
代码如下:
class NeighborSum(object):def __init__(self, grid):""":type grid: List[List[int]]"""# 存储 grid 以及每个元素值到其坐标位置的映射self.grid = gridself.pos = {}# 遍历二维数组,构建每个值到坐标位置的字典映射for i in range(len(grid)):for j in range(len(grid[0])):self.pos[grid[i][j]] = (i, j)def adjacentSum(self, value):""":type value: int:rtype: int"""# 检查是否存在该值if value not in self.pos:return 0# 获取值的坐标x, y = self.pos[value]# 定义相邻的四个方向:上、下、左、右directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]adj_sum = 0# 遍历四个方向,检查是否越界并求和for dx, dy in directions:nx, ny = x + dx, y + dyif 0 <= nx < len(self.grid) and 0 <= ny < len(self.grid[0]):adj_sum += self.grid[nx][ny]return adj_sumdef diagonalSum(self, value):""":type value: int:rtype: int"""# 检查是否存在该值if value not in self.pos:return 0# 获取值的坐标x, y = self.pos[value]# 定义对角线的四个方向:左上、右上、左下、右下directions = [(-1, -1), (-1, 1), (1, -1), (1, 1)]diag_sum = 0# 遍历四个方向,检查是否越界并求和for dx, dy in directions:nx, ny = x + dx, y + dyif 0 <= nx < len(self.grid) and 0 <= ny < len(self.grid[0]):diag_sum += self.grid[nx][ny]return diag_sum
代码解析
1.构造函数 _ init _:初始化 NeighborSum 类时,构建一个字典 pos,将 grid 中每个元素的值与其在二维数组中的坐标位置 (i, j) 关联。这可以确保在常数时间内获取任何元素的坐标位置。
2.相邻元素和计算 adjacentSum:
获取指定 value 的坐标。
使用四个方向的坐标偏移量:上 (0, -1),下 (0, 1),左 (-1, 0),右 (1, 0)。
对每个方向计算新坐标,检查是否越界,若不越界则加到总和中。
对角线相邻元素和计算 diagonalSum:
3.获取指定 value 的坐标:
使用四个对角方向的坐标偏移量:左上 (-1, -1),右上 (-1, 1),左下 (1, -1),右下 (1, 1)。
对每个方向计算新坐标,检查是否越界,若不越界则加到总和中。
总结
时间和空间复杂度分析如下:
时间复杂度:
_ init _ 构造函数遍历二维数组,复杂度为O(n2)
adjacentSum 和 diagonalSum 查找元素位置并进行固定方向的遍历,复杂度O(1)。
空间复杂度:构造的字典 pos 占用O(n2)的空间。
总之,NeighborSum 类通过将数组元素值映射到坐标位置来完成题目要求。