【LeetCode】每日一题 2024_11_9 设计相邻元素求和服务(构造,哈希)
前言
每天和你一起刷 LeetCode 每日一题~
LeetCode 启动!
题目:设计相邻元素求和服务
近几天不知道力扣发什么疯,每日一题出的太抽象了,我题解是写不了一点了 . . . 今天稍微正常了些,就又来更新了~
代码与解题思路
先读题:
题目给出一个矩阵,让我们求矩阵中元素的上下左右或者对角线的和;一道比较好理解的构造题
比较方便的思路是,在构造矩阵的环节遍历矩阵的所有元素,通过哈希表将矩阵每个元素对应的上下左右以及对角线的和用 kv 的形式存储,后续需要使用的时候就能直接通过 O(1) 的复杂度查询了~
具体细节有详细的注释,代码如下:
// 前 4 个是上下左右,后 4 个是对角线
var dir = []struct{x, y int}{{1, 0},{-1, 0},{0, -1},{0, 1},{1, 1},{1, -1},{-1, 1},{-1, -1},
}// 下标 0 保存 AdjacentSum 的 kv,下标 1 保存 DiagonalSum 的 kv
type NeighborSum [][2]int// 初始化
func Constructor(grid [][]int) NeighborSum {n := len(grid)s := make(NeighborSum, n*n)// 遍历整个 grid,初始化每个元素的上下左右/对角线,对应的 kv 值for i, row := range grid {for j, value := range row {for k, d := range dir {x, y := i+d.x, j+d.y if x >= 0 && x < n && y >= 0 && y < n { // 防止越界// k/4:假设是前 4 个,结果就为 0,是后四个结果为 1// 用于区分是上下左右还是对角线的和s[value][k/4] += grid[x][y]}}}}return s
}// 上下左右
func (t NeighborSum) AdjacentSum(value int) int {return t[value][0]
}// 对角线
func (t NeighborSum) DiagonalSum(value int) int {return t[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);*/
每天进步一点点,我们明天不见不散~
可以和我刷一辈子的每日一题吗?
一题一题,积累起来就是一辈子。