(LeetCode)3242. 设计相邻元素求和服务(哈希表)

题目: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);
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值