【Leetcode刷题第五天】661. 图片平滑器[JAVA] 大家一起来刷题吧~
题目描述:
图像平滑器 是大小为 3 x 3 的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。
每个单元格的 平均灰度 定义为:该单元格自身及其周围的 8 个单元格的平均值,结果需向下取整。(即,需要计算蓝色平滑器中 9 个单元格的平均值)。
如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)
给你一个表示图像灰度的 m x n 整数矩阵 img ,返回对图像的每个单元格平滑处理后的图像 。
示例 1:
输入:img = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[0, 0, 0],[0, 0, 0], [0, 0, 0]]
示例 2:
输入: img = [[100,200,100],[200,50,200],[100,200,100]]
输出: [[137,141,137],[141,138,141],[137,141,137]]
下面画图来解释一下:
以每个小方块为中心构造九宫格,超出原本九宫格的范围不记(即为0),只计算在原本九宫格的平均值。例如在第一张图中,sum/4 。第二张图中,sum/6。以此类推~
代码如下:
class Solution {
public int[][] imageSmoother(int[][] img) {
int m=img.length;
int n=img[0].length;
int ret[][]=new int[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
int sum=0;
int s=0;
for(int x=i-1;x<=i+1;x++){
for(int y=j-1;y<=j+1;y++){
if(x>=0&&y>=0&&x<m&&y<n){
sum+=img[x][y];
s++;
}
}
}
ret[i][j]=sum/s;
}
}
return ret;
}
}
总结:
可以自己多动手画一下图,思路会更清晰~