美文网首页算法程序员算法提高之LeetCode刷题
LeetCode算法题-Image Smoother(Java实

LeetCode算法题-Image Smoother(Java实

作者: 程序员小川 | 来源:发表于2019-03-20 08:30 被阅读10次

    这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

    相关文章

      网友评论

        本文标题:LeetCode算法题-Image Smoother(Java实

        本文链接:https://www.haomeiwen.com/subject/vpeamqtx.html