题目:图片平滑器
- 包含整数的二维矩阵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)