LeetCode 661. Image Smoother (图像平滑器)
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:
- The value in the given matrix is in the range of [0, 255].
- The length and width of the given matrix are in the range of [1, 150].
题目标签:Array
题目给了我们一个2d M array,让我们平滑处理图片。对于每一个cell,把它更新为 以自身为中心 3x3 的平均值。
就用常规方法做,新设一个 res[][] array,遍历M,对于每一个cell, 遍历以它为中心的3x3的cells,得到平均值,存入res。
需要注意的就是,3x3的边界问题。
Java Solution:
Runtime beats 72.97%
完成日期:10/19/2017
关键词:Array
关键点:处理3x3的边界问题
1 class Solution 2 { 3 public int[][] imageSmoother(int[][] M) 4 { 5 int rows = M.length; 6 int cols = M[0].length; 7 int[][] res = new int[rows][cols]; 8 9 for(int i=0; i<rows; i++) 10 { 11 for(int j=0; j<cols; j++) 12 { 13 int sum = 0; 14 int count = 0; 15 // sum 3x3 area and take care of the boundary 16 for(int x=Math.max(0,i-1); x<=Math.min(rows-1, i+1); x++) 17 { 18 for(int y=Math.max(0, j-1); y<=Math.min(cols-1, j+1); y++) 19 { 20 sum += M[x][y]; // sum up cells value 21 count++; // count cells number 22 } 23 } 24 25 res[i][j] = sum / count; // get average value 26 } 27 } 28 29 return res; 30 } 31 }
参考资料:N/A
LeetCode 题目列表 - LeetCode Questions List