包含整数的二维矩阵 M 表示一个图片的灰度。你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多的利用它们。
输入:
[[1,1,1],
[1,0,1],
[1,1,1]]
输出:
[[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]
看到这个题目一开始没啥思路,只有暴力的想法。后来看到别人的思路发现非常神奇,涨姿势了。
首先可以用到的就是方向向量法。把需要操作的格子做成一个方向向量表,遍历向量表操作,同时加上筛选条件,选取需要的格子。代码如下:
class Solution {
public int[][] imageSmoother(int[][] M) {//方向向量法
int r = M.length;
int c = M[0].length;
int[][] dir = {
{-1,-1},{-1,0},{-1,1},{0,-1},{0,0},{0,1},{1,-1},{1,0},{1,1}};
int[][] res = new int[r][c];
for(int i = 0; i< r; i++)
for(int j = 0; j< c; j++)
{
int sum = 0;
int count = 0;
for(int[] d : dir)
{