QUESTION
easy
题目描述
包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的 8 个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多的利用它们。
示例 1:
输入:
[[1,1,1],
[1,0,1],
[1,1,1]]
输出:
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]
解释:
对于点 (0,0), (0,2), (2,0), (2,2): 平均(3/4) = 平均(0.75) = 0
对于点 (0,1), (1,0), (1,2), (2,1): 平均(5/6) = 平均(0.83333333) = 0
对于点 (1,1): 平均(8/9) = 平均(0.88888889) = 0
说明
- 给定矩阵中的整数范围为 [0, 255]。
- 矩阵的长和宽的范围均为 [1, 150]。
SOLUTION
这道题最棘手的就是边界处理,如何写出简洁漂亮且效率又高的代码,着实难倒了我。另外根据题目的说明,不会出现给出的矩阵为空的情况,所以不需要判断为空的情况。
由于我自己写的难看又丑陋,故不在这里分享我的办法了,展示一下别人优雅的代码吧
方法一
class Solution {
public:
vector<vector<int>> imageSmoother(vector<vector<int>>& M) {
int m = M.size(), n = M[0].size();
vector<vector<int>> res = M, dirs{{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1}};
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
int cnt = M[i][j], all = 1;
for (auto dir : dirs) {
int x = i + dir[0], y = j + dir[1];
if (x < 0 || x >= m || y < 0 || y >= n) continue;
++all;
cnt += M[x][y];
}
res[i][j] = cnt / all;
}
}
return res;
}
};
方法二
Leetcode 耗时较少(这个人 m 和 n 是反过来的)
class Solution {
public:
vector<vector<int>> imageSmoother(vector<vector<int>>& M) {
int n = M.size(), m = M[0].size();
vector<vector<int> > res;
for(int i = 0; i < n; i++){
vector<int> tmp(m);
for(int j = 0; j < m; j++){
int c = 0;
int k = 0;
int pt = i > 0 ? i-1 : i;
int pb = i < n-1 ? i+1 : i;
int pl = j > 0 ? j-1 : j;
int pr = j < m-1 ? j+1 : j;
for(int p = pt; p <= pb; p++){
for(int q = pl; q <= pr; q++){
k += M[p][q];
c++;
}
}
tmp[j] = k / c;
}
res.push_back(tmp);
}
return res;
}
};