题目描述:
Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoother to make the gray scale of each cell becomes the average gray scale (rounding down) of all the 8 surrounding cells and itself. If a cell has less than 8 surrounding cells, then use as many as you can.
Example 1:
Input: [[1,1,1], [1,0,1], [1,1,1]] Output: [[0, 0, 0], [0, 0, 0], [0, 0, 0]] Explanation: For the point (0,0), (0,2), (2,0), (2,2): floor(3/4) = floor(0.75) = 0 For the point (0,1), (1,0), (1,2), (2,1): floor(5/6) = floor(0.83333333) = 0 For the point (1,1): floor(8/9) = floor(0.88888889) = 0
Note:
例如,输入
[[1,1,1], [1,0,1], [1,1,1]]
输出矩阵的第一个点的值为点[0,0] [0,1], [1,0] [1,1] 的均值=3/4=0。
最简单的解题思路:遍历这个二维数组,每个元素都判断一下左边,右边,上边,下边是否有元素,再判断左下、左上、右下、右上是否有元素。有的话就加起来,并计数器加一,记得将这个元素也要算入到均值中。
非常简单,但是比较长。
public int[][] imageSmoother(int[][] M) {
int[][] result=new int[M.length][M[0].length];
for(int i=0;i=0){
sum+=M[i-1][j];
count++;
hasLeft=true;
}
if(i+1=0){
sum+=M[i][j-1];
count++;
hasDown=true;
}
if(j+1
我们在计算每个平均值时其实也是在求一个矩阵的平均值。
这个矩阵就是以这个元素为中心的矩阵的均值。
例如:求第一个元素的围绕的平均值时,其实就是再 求下面红色这个矩阵的平均值:
[[1, 1, 1],
[1, 0, 1],
[1, 1, 1]]
第二个元素,对应的矩阵
[[1, 1, 1],
[1, 0, 1],
[1, 1, 1]]
最中间的元素,对应的矩阵:
[[1, 1, 1],
[1, 0,1 ],
[1, 1, 1]]
所以只要找到每个元素对应的矩阵,然后求这个矩阵的平均值就可以了。
在找这个矩阵时,神秘大神用了一个非常赞的办法,就是把边界限制不超过长度,不小于0。代码如下:
class Solution {
public int[][] imageSmoother(int[][] M) {
int m = M.length;
int n = M[0].length;
int[][] res = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
res[i][j] = smooth(M, m, n, i, j);
}
}
return res;
}
private int smooth(int[][] M, int m, int n, int x, int y) {
int sum = 0;
int cnt = 0;
for (int i = Math.max(0, x - 1); i <= Math.min(m - 1, x + 1); i++) {
for (int j = Math.max(0, y - 1); j <= Math.min(n - 1, y + 1); j++) {
sum += M[i][j];
cnt++;
}
}
return sum / cnt;
}
}
所以要善于用数学函数么!