题目描述
给你一个 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。
解题思路
初始化grid时用map记录每个元素的位置信息,然后使用偏移量数组dx和dy记录移动的方向,前四个是计算相邻位置的,后四个是记录对角线元素的。在计算时,只需遍历四个方向判定是否合法后,返回和值即可。
AC代码
class NeighborSum {
public:unordered_map<int, pair<int, int>> pos;int n = 0, m = 0;int dx[8] = {-1, 0, 1, 0, -1, -1, 1, 1}, dy[8] = {0, 1, 0, -1, -1, 1, -1, 1};vector<vector<int>> s;NeighborSum(vector<vector<int>>& grid) {n = grid.size();m = grid[0].size();s = grid;for(int i = 0; i < n; i ++ )for(int j = 0; j < m; j ++) {pos[grid[i][j]] = {i, j};}}int adjacentSum(int value) {pair<int, int> p = pos[value];long ans = 0;for(int i = 0; i < 4; i ++) {int x = p.first + dx[i], y = p.second + dy[i];if(x >= 0 && x < n && y >= 0 && y < m)ans += s[x][y];}return ans;}int diagonalSum(int value) {pair<int, int> p = pos[value];long ans = 0;for(int i = 4; i < 8; i ++) {int x = p.first + dx[i], y = p.second + dy[i];if(x >= 0 && x < n && y >= 0 && y < m)ans += s[x][y];}return ans;}
};/*** 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);*/