LeetCode算法题-Image Smoother(Java实现)

这是悦乐书的第282次更新,第299篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第150题(顺位题号是661)。给定表示图像灰度的2D整数矩阵M,您需要设计一个平滑器以使每个单元的灰度变为所有8个周围单元及其自身的平均灰度(向下舍入)。如果一个单元的周围单元少于8个,那么尽可能多地使用单元。例如:

输入:[[1,1,1],[1,0,1][1,1,1]]

输出:[[0,0,0],[0,0,0],[0,0,0]]

说明:

对于点(0,0),(0,2),(2,0),(2,2):floor(3/4)= floor(0.75)= 0

对于点(0,1),(1,0),(1,2),(2,1):floor(5/6)= floor(0.83333333)= 0

对于点(1,1):floor(8/9)= floor(0.88888889)= 0


注意:

  • 给定矩阵中的值在[0,255]的范围内。

  • 给定矩阵的长度和宽度在[1,150]的范围内。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 解题

题目的意思是根据给定的二维数组,将其周围的相邻元素和其自身的值加起来算平均值,一次计算最多是9个单元格(包含自身)。题目所给的那个示例,M[0][0]这个元素只用算4个单元格元素的平均值即可,因为另外几个都是边界。所以,根据题目的意思,直接翻译过来就行,外面两层循环控制当前取哪个点展开计算,内层两层循环控制当前这个点需要计算周围那些相邻的单元格,算完平均值后,重新赋值即可。

public int[][] imageSmoother(int[][] M) {
    if (M == null || M.length == 0 || M[0].length == 0) {
        return M;
    }
    int row = M.length, col = M[0].length;
    int[][] result = new int[row][col];
    for (int i=0; i<row; i++) {
        for (int j=0; j<col; j++) {
            int count = 0;
            int sum = result[i][j];
            for (int k=i-1; k <= i+1; k++) {
                for (int h=j-1; h <= j+1; h++) {
                    if (0 <= k && k < row && 0 <= h && h <col) {
                        sum += M[k][h];
                        count++;
                    }
                }
            }
            result[i][j] = sum/count;
        }
    }
    return result;
}

03 小结

算法专题目前已日更超过四个月,算法题文章150+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

posted @ 2019-03-20 08:32  程序员小川  阅读(371)  评论(0编辑  收藏  举报