题目:图片平滑器

  • 包含整数的二维矩阵M表示一个图片的灰度。
  • 你需要设计一个平滑器来让每一个单元的灰度成为平均灰度(向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多的利用它们。
示例 1:
输入:
[[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): 平均(3/4) = 平均(0.75) = 0
对于点 (0,1), (1,0), (1,2), (2,1): 平均(5/6) = 平均(0.83333333) = 0
对于点 (1,1): 平均(8/9) = 平均(0.88888889) = 0
注意:
  • 给定矩阵中的整数范围为 [0, 255]。
  • 矩阵的长和宽的范围均为 [1, 150]。

来源:力扣(LeetCode)第661题

链接:https://leetcode-cn.com/problems/image-smoother

分析:

  • 可以一个一个判断,但是不好,另一种方法,先把八个方向放在一个列表中,然后每次遍历这八个方向。

代码:

class Solution:
    def imageSmoother(self, M: List[List[int]]) -> List[List[int]]:
        ans = []
        directions = [[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]]  # 生成八个方向的列表。
        height = len(M)
        width = len(M[0])
        for i in range(height):
            tmp = []
            for j in range(width):
                res = M[i][j]
                cnt = 1
                for direction in directions:
                    y = direction[0] + i
                    x = direction[1] + j
                    if y < height and x < width and x >= 0 and y >= 0:  # 每次都要判断方向是否合法,防止数组越界。
                        res += M[y][x]
                        cnt += 1
                tmp.append(res // cnt)
            ans.append(tmp)
        return ans

复杂度分析:

  • 时间复杂度:O(n) n为M的长度和宽度
  • 空间复杂度:O(n)