题目:3242. 设计相邻元素求和服务
思路:先遍历每一个位置grid[i][j],预处理出两种可能之和即可。
C++版本:
class NeighborSum {
public:
int fx[8]={-1,0,0,1,-1,-1,1,1};
int fy[8]={0,-1,1,0,-1,1,-1,1};
vector<vector<int>> v;
NeighborSum(vector<vector<int>>& grid) {
int n=grid.size();
v=vector<vector<int>>(n*n,vector<int>(2,0));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<8;k++){
int xx=i+fx[k];
int yy=j+fy[k];
if(xx<0||xx>=n||yy<0||yy>=n) continue;
v[grid[i][j]][k/4]+=grid[xx][yy];
}
}
}
}
int adjacentSum(int value) {
return v[value][0];
}
int diagonalSum(int value) {
return v[value][1];
}
};
/**
* 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);
*/
JAVA版本:
class NeighborSum {
int[] fx={-1,0,0,1,-1,-1,1,1};
int[] fy={0,-1,1,0,-1,1,-1,1};
int[][] v;
public NeighborSum(int[][] grid) {
int n=grid.length;
v=new int[n*n][2];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
for(int k=0;k<8;k++){
int xx=i+fx[k];
int yy=j+fy[k];
if(xx<0||xx>=n||yy<0||yy>=n) continue;
v[grid[i][j]][k/4]+=grid[xx][yy];
}
}
}
}
public int adjacentSum(int value) {
return v[value][0];
}
public int diagonalSum(int value) {
return v[value][1];
}
}
/**
* 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);
*/
Go版本:
type NeighborSum struct {
v [][2]int
}
func Constructor(grid [][]int) NeighborSum {
fx:=[]int{-1,0,0,1,-1,-1,1,1};
fy:=[]int{0,-1,1,0,-1,1,-1,1};
n:=len(grid)
v:=make([][2]int,n*n)
for i:=0;i<n;i++{
for j:=0;j<n;j++ {
for k:=0;k<8;k++ {
xx :=i+fx[k];
yy :=j+fy[k];
if xx<0||xx>=n||yy<0||yy>=n {
continue
}
v[grid[i][j]][k/4]+=grid[xx][yy];
}
}
}
return NeighborSum{
v: v,
}
}
func (this *NeighborSum) AdjacentSum(value int) int {
return this.v[value][0]
}
func (this *NeighborSum) DiagonalSum(value int) int {
return this.v[value][1]
}
/**
* Your NeighborSum object will be instantiated and called as such:
* obj := Constructor(grid);
* param_1 := obj.AdjacentSum(value);
* param_2 := obj.DiagonalSum(value);
*/