1.题目
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翻译:给定一个二维整型矩阵M表示图片的灰度,你需要设计一个校平器,使每个元素的灰度变成它和它周围8个灰度的平均值。如果它周围少于8个元素,就有多少用多少。
2.思路
思路1:就是遍历去做。计算每一个点,和他周围的点的平均值,记录到新的矩阵上,最后返回这个新的矩阵。
思路2:有一点优化的想法在里面,比如计算一维数组,计算每个数和其前面n位、其后面n位的数的和;第i位和第i+1位,中间的几位数字是重复的。
3.算法
第二个思路我没有实现,第一个算法
class Solution { public int[][] res ; int row;//行数 int column;//列数 public int[][] imageSmoother(int[][] M) { row = M.length;//矩阵的行数 column = M[0].length;//矩阵的列数 res = new int[row][column]; for(int i=0;i<row;i++){ for(int j=0;j<column;j++){ res[i][j]=0; compute(i,j,M); } } return res; } private void compute(int m,int n,int[][] source){ int temp=0; int count=0; for(int i=m-1;i<=m+1;i++){//行不要越界 if(i<0||i>=row)continue; for(int j=n-1;j<=n+1;j++){//列不要越界 if(j<0||j>=column)continue; temp+=source[i][j]; count++; } } res[m][n]= (int)temp/count;//求平均值 } }
4.总结
最近真的深刻体会到了优化的重要性,要时刻想着优化的事情。