题目
思路 遍历
根据题意,计算每个位置的值。
代码
class Solution {
public:
vector<vector<int>> imageSmoother(vector<vector<int>>& img) {
int dirs[9][2] = {{-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 0}, {0, 1}, {1, -1}, {1, 0}, {1,1}};
int m = img.size(), n = img[0].size();
vector<vector<int>> ans(m, vector<int>(n));
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
int len = 0, sum = 0;
for(int k = 0; k < 9; k++){
int nx = i + dirs[k][0], ny = j + dirs[k][1];
if(nx < 0 || nx >= m || ny < 0 || ny >= n)
continue;
len++;
sum += img[nx][ny];
}
ans[i][j] = sum / len;
}
}
return ans;
}
};
思路 前缀和
计算从[0,0]位置到[i,j]位置的前缀和,计算结果时直接相减就好。
代码
class Solution {
public:
vector<vector<int>> imageSmoother(vector<vector<int>>& img) {
int m = img.size(), n = img[0].size();
vector<vector<int>> sum(m + 1, vector<int>(n + 1));
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + img[i - 1][j - 1];
}
}
vector<vector<int>> ans(m, vector<int>(n));
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
int a = max(0, i - 1), b = max(0, j - 1), c = min(i + 1, m - 1), d = min(j + 1, n - 1);
int cnt = (c - a + 1) * (d - b + 1);
int total = sum[c + 1][d + 1] - sum[a][d + 1] - sum[c + 1][b] + sum[a][b];
ans[i][j] = total / cnt;
}
}
return ans;
}
};