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

给你一个 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);
 */
相关推荐
无限码力5 小时前
科大讯飞秋招笔试真题 - 字符拼接 & 字典序最小的字符串拼接 & 圆心覆盖
算法·秋招·科大讯飞·科大讯飞笔试真题
Lips6116 小时前
第四章 决策树
算法·决策树·机器学习
Coder_Boy_6 小时前
基于SpringAI的在线考试系统-DDD(领域驱动设计)核心概念及落地架构全总结(含事件驱动协同逻辑)
java·人工智能·spring boot·微服务·架构·事件驱动·领域驱动
YuTaoShao6 小时前
【LeetCode 每日一题】2053. 数组中第 K 个独一无二的字符串
算法·leetcode·职场和发展
黎雁·泠崖6 小时前
Java&C语法对比:分支与循环结构核心全解析
java·c语言
鹿角片ljp6 小时前
Java IO流案例:使用缓冲流恢复《出师表》文章顺序
java·开发语言·windows
毕设源码-郭学长6 小时前
【开题答辩全过程】以 广告投放管理系统为例,包含答辩的问题和答案
java
小北方城市网6 小时前
SpringBoot 集成 RabbitMQ 实战(消息队列解耦与削峰):实现高可靠异步通信
java·spring boot·python·微服务·rabbitmq·java-rabbitmq·数据库架构
java_t_t6 小时前
Maven插件apiscan介绍与使用
java·maven·api文档·maven插件
带刺的坐椅6 小时前
FastJson2 与 SnackJson4 有什么区别?
java·jsonpath·fastjon2·snack4