《力扣算法训练提升》图解数组篇-打卡数组统计-【661】图片平滑器

囧么肥事今日打卡题目

力扣【661.图片平滑器】

包含整数的二维矩阵 M 表示一个图片的灰度。

你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,

平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多的利用它们。

具体描述

解题讨论

注意:这里解释一下,本篇内容所有的方阵(指的是矩形阵列,不一定是长宽相同的正方形"方阵"),顺手写的方阵,大致就是矩形阵列的意思,后面懒得改了,勉勉强强看吧!

讨论归纳一:轮番询问周围所有兵士

第一步:遍历数组,
每个战士轮番询问自己周围所有兵士军功

    判断左方是否有人,记录军功
    判断左上是否有人,记录军功
    判断上方是否有人,记录军功
    判断右上是否有人,记录军功
    判断右方是否有人,记录军功
    判断右下是否有人,记录军功
    判断下方是否有人,记录军功
    判断左下是否有人,记录军功

第二步:计算平均军功

动画模拟

示例一:轮番询问周围所有兵士

注:代码可左右滑动

// a[i][j]
// 判断左方是否存在
// 判断左上是否存在
// 判断上方是否存在
// 判断右上是否存在
// 判断右方是否存在
// 判断右下是否存在
// 判断下方是否存在
// 判断左下是否存在
public int[][] imageSmoother(int[][] img) {

    // 二维数组行数
    int rowNums = img.length;
    // 二维数组列数
    int colNums = img[0].length;

    int[][] res = new int[rowNums][colNums];


    for (int i = 0; i < rowNums; i++) {

        for (int j = 0; j < colNums; j++) {
            int count = 1;
            int sum = img[i][j];

            // a[i][j]
            // 判断左方是否存在
            if (j - 1 >= 0) {
                count++;
                sum += img[i][j - 1];
            }
            // 判断左上是否存在
            if (i - 1 >= 0 && j - 1 >= 0) {
                count++;
                sum += img[i - 1][j - 1];
            }
            // 判断上方是否存在
            if (i - 1 >= 0) {
                count++;
                sum += img[i - 1][j];
            }
            // 判断右上是否存在
            if (i - 1 >= 0 && j + 1 < colNums) {
                count++;
                sum += img[i - 1][j + 1];
            }
            // 判断右方是否存在
            if (j + 1 < colNums) {
                count++;
                sum += img[i][j + 1];
            }
            // 判断右下是否存在
            if (i + 1 < rowNums && j + 1 < colNums) {
                count++;
                sum += img[i + 1][j + 1];
            }
            // 判断下方是否存在
            if (i + 1 < rowNums) {
                count++;
                sum += img[i + 1][j];
            }
            // 判断左下是否存在
            if (i + 1 < rowNums && j - 1 >= 0) {
                count++;
                sum += img[i + 1][j - 1];
            }

            res[i][j] = (sum / count);
        }
    }

    return res;
}

复杂度分析

时间复杂度:O(N),其中 N 是图片中像素的数目。需要遍历每个像素。
空间复杂度:O(N),如果忽略返回,空间复杂度 O(1)。

讨论归纳二:军队方阵报数

第一步:选取中心兵,开辟小型方阵
第二步:小型方阵战士依次报数
第三步:计算平均军功

动画模拟

示例二:军队方阵报数

注:代码可左右滑动

public int[][] imageSmoother(int[][] img) {

    // 二维数组行数
    int rowNums = img.length;
    // 二维数组列数
    int colNums = img[0].length;

    // 结果
    int[][] res = new int[rowNums][colNums];

    for (int i = 0; i < rowNums; i++) {

        for (int j = 0; j < colNums; j++) {

            // 当前战士 a[i][j]
            // 划分小型阵列,找到阵列边界
            // 判断前后左右是否有队列

            // 前方队列
            int si = i - 1;
            // 后方队列
            int ei = i + 1;
            // 左边队列
            int sj = j - 1;
            // 右边队列
            int ej = j + 1;

            int count = 0;
            int sum = 0;

            // 报数
            for (int rowI = si; rowI <= ei; rowI++) {
                for (int colI = sj; colI <= ej; colI++) {
                    // 判断小型阵列是否在大阵列内
                    // 只有在阵列内,才是有效阵列
                    if (rowI >= 0 && rowI < rowNums && colI >= 0 && colI < colNums) {
                        sum += img[rowI][colI];
                        count++;
                    }
                }
            }


            res[i][j] = (sum / count);
        }
    }

    return res;
}

复杂度分析

时间复杂度:O(N),其中 N 是图片中像素的数目。需要遍历每个像素。
空间复杂度:O(N),如果忽略返回,空间复杂度 O(1)。

短话长说

学算法先学什么?什么阶段该刷什么题?

关注我,日常打卡算法图解。

按照力扣题目类别结构化排序刷题,从低阶到高阶,图解算法(更新中…),有兴趣的童鞋,欢迎一起从小白开始零基础刷力扣,共同进步!

回复:678,获取已分类好的部分刷题顺序,后续内容会持续更新,感兴趣的小伙伴自由拿取!

另外,有关分类,求小伙伴们不要再问我最后一类的起名了,奇技淫巧是个褒义词,意思是指新奇的技艺和作品。

力扣修炼体系题目,题目分类及推荐刷题顺序及题解

目前暂定划分为四个阶段:

算法低阶入门篇--武者锻体

算法中级进阶篇--武皇炼心

算法高阶强化篇--武帝粹魂

算法奇技淫巧篇--战斗秘典

以上分类原谅我有个修仙梦...

缺漏内容,正在努力整理中…

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务