首页 > 其他分享 >3242. 设计相邻元素求和服务

3242. 设计相邻元素求和服务

时间:2024-11-10 09:44:04浏览次数:3  
标签:相邻 求和 3242 复杂度 元素 value int grid n2

文章目录

问题描述

  • 给你一个 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 在左上、右上、左下或右下的元素。

解决思路

  • 用一个长为 8 的数组存放偏移向量,前 4 个表示上下左右四个方向,后 4 个表示斜向的四个方向。

  • 用一个大小为 n2×2 的数组 s 预处理元素和,其中 s[v][0] 为 adjacentSum(v) 的结果,s[v][1] 为 diagonalSum(v) 的结果。这可以在初始化时,遍历 grid[i][j] 以及偏移向量,累加每个元素的相邻元素之和计算出来。

代码示例

class NeighborSum {
    static constexpr int dirs[8][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {1, 1}, {-1, 1}, {-1, -1}, {1, -1}};
    vector<array<int, 2>> s;
public:
    NeighborSum(vector<vector<int>>& grid) {
        int n = grid.size();
        s.resize(n * n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                int v = grid[i][j];
                for (int k = 0; k < 8; k++) {
                    int x = i + dirs[k][0], y = j + dirs[k][1];
                    if (0 <= x && x < n && 0 <= y && y < n) {
                        s[v][k / 4] += grid[x][y];
                    }
                }
            }
        }
    }

    int adjacentSum(int value) {
        return s[value][0];
    }

    int diagonalSum(int value) {
        return s[value][1];
    }
};

复杂度分析

  • 时间复杂度:初始化 O(n2),其余 O(1),其中 n 为 grid 的行数和列数。
  • 空间复杂度:初始化 O(n2),其余 O(1)。

标签:相邻,求和,3242,复杂度,元素,value,int,grid,n2
From: https://blog.csdn.net/ysw234567/article/details/143647630

相关文章

  • 每日一题.设计相邻元素求和服务;暴力算法与哈希表的运用
    本题出自LeetCode每日一题3242,可以说比昨天的那道“每日抑题”简单不少呀,就是代码长一点,同时本题目使用了两种不同的方法,并对每一种用法进行了深度解析。本文全长5000字。题目 给你一个 nxn 的二维数组 grid,它包含范围 [0,n2-1] 内的不重复元素。实现 neighbo......
  • 力扣21 打卡17 设计相邻元素求和服务
    思路:该方案通过构建一个字典,将每个元素值映射到其在二维数组中的坐标位置,以便快速查找。adjacentSum方法根据指定元素的坐标,计算其上下左右相邻元素之和;diagonalSum方法则计算该元素的四个对角线相邻元素之和。每个方法通过判断相邻坐标是否在数组边界内,确保不越界访问。......
  • clickhouse数据库,时间范围一周,周期为每一小时,聚合数据中的最新,最大值,最小值,平均值,求和
    工作中通过ai改来改去最后实现的,非常好用databaseVal举例:1HOURinterval:1WEEK最新,这里用到了ROW_NUMBER,就是编号,OVER就是分组,分组是通过一小时聚合,聚合后会有编号每一个组的,从1开始到该组结束,取每组的第一条就是最新的SELECTreport_timeAStimeInterval,cpu_usageAScpu......
  • L1-009 N个数求和
    目录一、问题描述二、问题分析 三、源码解答四、参考资料一、问题描述本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。1.输入格式输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1a2/b......
  • P6667 [清华集训2016] 如何优雅地求和 题解
    一道非常有启发性的题目。思路考虑对于一个给出点值的多项式函数如何处理。我们发现,对于一个\(m\)次多项式\(f(x)\),由于\(\binom{x}{i}\)为\(i\)次多项式,所以说我们必定可以把一个多项式函数写成如下模样:\[F(k)=\sum_{i=0}^m\binom{k}{i}f_i\]可以看出,\(f_i\)实际上......
  • 使用 axios 拦截器实现请求和响应的统一处理(附常见面试题)
    在现代前端开发中,我们经常需要向服务器发送HTTP请求,并根据响应内容做不同的处理。axios是一个流行的HTTP库,提供了拦截器功能,可以在请求和响应阶段插入自定义逻辑,这使得我们在处理认证、错误提示等场景时更为简洁、统一。本文将讲解如何利用axios的请求拦截器和响应拦......
  • clickhouse数据库,同样的分组方式、查询条件,求和的结果不一致
    原因clickhouse和其他数据库的不同点之一,在查询条件引用字段时,会优先取select查出来的字段,即便在字段的值中做了字符拼接,也会优先使用拼接后的字符。如下代码selectconcat(concat(substr('2024-09',1,4),'-01-'),'2024-09')asperiod,customer_no,customer......
  • LeetCode 3165.不包含相邻元素的子序列的最大和:单点修改的线段树(动态规划)
    【LetMeFly】3165.不包含相邻元素的子序列的最大和:单点修改的线段树(动态规划)力扣题目链接:https://leetcode.cn/problems/maximum-sum-of-subsequence-with-non-adjacent-elements/给你一个整数数组nums和一个二维数组queries,其中queries[i]=[posi,xi]。对于每个查......
  • 代码随想录算法训练营第十天|leetcode232.用栈实现队列、leetcode225. 用队列实现栈、
    1leetcode232.用栈实现队列题目链接:232.用栈实现队列-力扣(LeetCode)文章链接:代码随想录视频链接:栈的基本操作!|LeetCode:232.用栈实现队列哔哩哔哩bilibili自己的思路:真的第一次接触这个概念,完全没有任何思路,甚至不知道从何下手1.1基本概念栈就是相当于砌墙的砖头,先......
  • 【数据结构-邻项消除】力扣1047. 删除字符串中的所有相邻重复项
    给出由小写字母组成的字符串s,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在s上反复执行重复项删除操作,直到无法继续删除。在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。示例:输入:“abbaca”输出:“ca”解释:例如,在“abbaca”中,我们可以......