当前位置: 首页 > news >正文

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 类通过将数组元素值映射到坐标位置来完成题目要求。
在这里插入图片描述


http://www.mrgr.cn/news/69248.html

相关文章:

  • 不同系统,单点登录实现解决方案,一次登录多系统验证!
  • AHB Matrix 四星级 验证笔记(2.4) Tt3.3AHB总线协议测试时的 并行数据
  • 更改Ubuntu22.04锁屏壁纸
  • U盘@购买攻略@检测工具@扩容检测
  • 大数据面试题--kafka夺命连环问
  • 周末适合做一些总结性的工作,不适合开启新的探索性的任务
  • 【JavaEE初阶 — 多线程】死锁的产生原因和解决方法
  • 【51单片机】UART串口通信原理 + 使用
  • Spring Security(5.x, 6.x ) RBAC访问控制
  • 数据冒险-ld,ld,dadd
  • requestAnimationFrame与setInterval的抉择
  • 银行卡归属地查询API接口如何用Python调用
  • ClickHouse创建分布式表
  • Ubuntu 修改时区 同步时间
  • 计算机组成原理--三章四章
  • 良品铺子被立案调查,同行却异常沉默
  • Unity 如何优雅的限定文本长度, 包含对特殊字符,汉字,数字的处理。实际的案例包括 用户昵称
  • NumPy与TensorFlow-tf.tensor异同点
  • Vue全栈开发旅游网项目(9)-用户登录/注册及主页页面开发
  • C# 集合与泛型