您的位置:首页 > 教育 > 锐评 > 环保网页设计_成都微信小程序开发_哈尔滨seo优化软件_seo短期培训班

环保网页设计_成都微信小程序开发_哈尔滨seo优化软件_seo短期培训班

2025/2/25 9:12:03 来源:https://blog.csdn.net/qq_41529799/article/details/143637524  浏览:    关键词:环保网页设计_成都微信小程序开发_哈尔滨seo优化软件_seo短期培训班
环保网页设计_成都微信小程序开发_哈尔滨seo优化软件_seo短期培训班

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

今天这题目确实简单,因为数据范围极小,所以只要按照题目要求去模拟就可以了。

不过我选择了把数据进行预处理,开了一个数组存每个元素的相邻和与对角和。在构造函数里就遍历一遍把答案算出来,后面两个查询函数就直接返回答案就可以了。

class NeighborSum {
public:int getAdj(vector<vector<int>>& grid, int n, int x, int y){int sum=0;if (x-1>-1) sum+=grid[x-1][y];if (x+1<n) sum+=grid[x+1][y];if (y-1>-1) sum+=grid[x][y-1];if (y+1<n) sum+=grid[x][y+1];return sum; }int getDia(vector<vector<int>>& grid, int n, int x, int y){int sum=0;if (x-1>-1){if (y-1>-1) sum+=grid[x-1][y-1];if (y+1<n) sum+=grid[x-1][y+1];}if (x+1<n){if (y-1>-1) sum+=grid[x+1][y-1];if (y+1<n) sum+=grid[x+1][y+1];}return sum;}vector<pair<int, int> > ans; // first=adjacentSum, second=diagonalSumNeighborSum(vector<vector<int>>& grid) {int n = grid.size();ans.resize(n*n);for (int i=0; i<n; ++i){for (int j=0; j<n; ++j){ans[grid[i][j]]=make_pair(getAdj(grid, n, i, j), getDia(grid, n, i, j));}}}int adjacentSum(int value) {return ans[value].first;}int diagonalSum(int value) {return ans[value].second;}};/*** 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);*/

构造函数的时间复杂度O(n*n),两个查询的函数的时间复杂度O(1)。

空间复杂度O(n*n)。

也可以直接把构造函数的参数存起来,然后在查询的函数里找元素位置再计算。要省时间的话,还可以再开个哈希表把元素值和位置做个映射,虽然以这个题来说完全没有必要

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com