【从零开始的LeetCode-算法】3242. 设计相邻元素求和服务

ops/2024/11/13 2:49:43/

给你一个 n x n 的二维数组 grid,它包含范围 [0, n2 - 1] 内的不重复元素。

实现 neighborSum 类:

  • neighborSum(int [][]grid) 初始化对象。
  • int adjacentSum(int value) 返回在 grid 中与 value 相邻的元素之,相邻指的是与 value 在上、左、右或下的元素。
  • int diagonalSum(int value) 返回在 grid 中与 value 对角线相邻的元素之,对角线相邻指的是与 value 在左上、右上、左下或右下的元素。

示例 1:

输入:

["neighborSum", "adjacentSum", "adjacentSum", "diagonalSum", "diagonalSum"]

[[[[0, 1, 2], [3, 4, 5], [6, 7, 8]]], [1], [4], [4], [8]]

输出: [null, 6, 16, 16, 4]

解释:

  • 1 的相邻元素是 0、2 和 4。
  • 4 的相邻元素是 1、3、5 和 7。
  • 4 的对角线相邻元素是 0、2、6 和 8。
  • 8 的对角线相邻元素是 4。

示例 2:

输入:

["neighborSum", "adjacentSum", "diagonalSum"]

[[[[1, 2, 0, 3], [4, 7, 15, 6], [8, 9, 10, 11], [12, 13, 14, 5]]], [15], [9]]

输出: [null, 23, 45]

解释:

  • 15 的相邻元素是 0、10、7 和 6。
  • 9 的对角线相邻元素是 4、12、14 和 15。

提示:

  • 3 <= n == grid.length == grid[0].length <= 10
  • 0 <= grid[i][j] <= n^2 - 1
  • 所有 grid[i][j] 值均不重复。
  • adjacentSumdiagonalSum 中的 value 均在范围 [0, n^2 - 1] 内。
  • 最多会调用 adjacentSumdiagonalSum 总共 2 * n^2 次。

我的解答

java">class NeighborSum {private int[][] grid;private Map<Integer, int[]> pos;private final int[][][] dirs = {{{-1, 0}, {1, 0}, {0, -1}, {0, 1}},      {{-1, -1}, {-1, 1}, {1, -1}, {1, 1}}};public NeighborSum(int[][] grid) {this.grid = grid;this.pos = new HashMap<>();for (int i = 0; i < grid.length; i++) {for (int j = 0; j < grid[0].length; j++) {// 记录数组值和它多对应的索引值pos.put(grid[i][j], new int[]{i, j});}}}public int adjacentSum(int value) {return getSum(value,0);}public int diagonalSum(int value) {return getSum(value,1);}private int getSum(int value, int idx) {int[] p = pos.get(value);int x = p[0], y = p[1];int sum = 0;for (int[] dir : dirs[idx]) {int nx = x + dir[0];int ny = y + dir[1];if (nx >= 0 && nx < grid.length && ny >= 0 && ny < grid[0].length) {sum += grid[nx][ny];}}return sum;}
}/*** Your NeighborSum object will be instantiated and called as such:* NeighborSum obj = new NeighborSum(grid);* int param_1 = obj.adjacentSum(value);* int param_2 = obj.diagonalSum(value);*/


http://www.ppmy.cn/ops/132922.html

相关文章

【Java SE】枚举类

枚举&#xff08;enumeration&#xff0c;简写为 enum&#xff09;是一种特殊的类&#xff0c;用于表示一组有限的常量。它包含一组特定的、固定的对象。例如&#xff0c;表示季节时&#xff0c;我们可以定义一个枚举来表示春天、夏天、秋天和冬天。如果直接用类来实现季节&…

元素定位和标准流理解[从本质到理解]

元素定位和标准流理解 1.1 标准流(Normal)布局 默认情况下&#xff0c;元素都是按照normal flow(标准流、常规流、文档流[document flow])进行排布 默认情况下&#xff0c;从左到右&#xff0c;从上到下按顺序摆放好默认情况下&#xff1a;互相之间不存在层叠现象 <body&g…

股票短线的建议(学习)- 20241111

策略 尾盘进早盘出 尾盘30分钟是全天集中交易的时候&#xff0c;多空双方的激烈交战会直接影响到第二天的走势 建议在这时买&#xff1f; 激烈交战&#xff1f;怎么影响&#xff1f; 下午2点30分之后开始筛选。把所有涨幅在3-5%的股票全部加入自选股&#xff0c;低于3%的说明…

hhdb数据库介绍(9-4)

访问安全 权限体系 计算节点有两类用户&#xff0c;一类是计算节点数据库用户&#xff0c;用于操作数据&#xff0c;执行SELECT&#xff0c;UPDATE&#xff0c;DELETE&#xff0c;INSERT等SQL语句。另一类是关系集群数据库可视化管理平台用户&#xff0c;用于管理配置信息。此…

15分钟学 Go 第 47 天 :并发进阶——深入了解Go语言的并发模型!

第47天的学习&#xff1a;并发进阶——深入了解Go语言的并发模型&#xff01; 目录 Go并发模型简介Goroutines深度讲解Channels的进阶使用Select语句详解并发模型设计模式实战案例分析常见问题与解决方案 1. Go并发模型简介 Go语言以其内置的并发支持而闻名。通过轻量级的g…

简单介绍下 Java 中的 @Validated 和 @Valid 注解的区别?

文章目录 Valid&#xff1a;专注单个对象的深度验证适用场景使用示例小结 Validated&#xff1a;聚焦接口分组的批量验证适用场景使用示例小结 主要区别总结如何选择&#xff1f;总结推荐阅读文章 在 Java 开发中&#xff0c;为了确保输入数据符合我们的要求&#xff0c;少不了…

新手 Vue 项目运行

前言&#xff1a;前面讲了我们已经将spingboot项目运行起来了&#xff0c;现在我们只需将后台管理的Vue项目运行起来即可完成整个项目。 在运行vue项目之前&#xff0c;请先运行springboot项目&#xff0c;运行步骤请看&#xff1a;运行Springboot Vue 项目_springbootvue项目…

Rollup failed to resolve import “destr“ from ***/node_modules/pinia-plugin-pers

在使用uni-appvuu3piniapinia-plugin-persistedstate开发中&#xff0c; 使用pinia-plugin-persistedstate 一直在报错&#xff0c;其实代码也是比较简单的&#xff0c; import { createPinia } from pinia // 创建 pinia 实例 const pinia createPinia(); import piniaPlugi…