题目描述:
包含整数的二维矩阵 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]。
解题思路:
在原矩阵周围添加一圈-1,这样每个数在计算的时候都可以计算其周围八个数,然后在计算均值时,分子表示九个数的和,需要加上这九个数中-1的个数,分母减去-1的个数即可,这样写比较简单但是时间比较长
class Solution:
def imageSmoother(self, M: List[List[int]]) -> List[List[int]]:
#在矩阵的周围添加一圈-1
for i in range(len(M)):
M[i]=[-1]+ M[i]+[-1]
M.insert(0,[-1]*len(M[0]))
M.append([-1]*len(M[0]))
N=[]#存放结果
for i in range(1,len(M)-1):
res=[]
for j in range(1,len(M[0])-1):
num=M[i-1][j-1:j+2].count(-1)+M[i][j-1:j+2].count(-1)+M[i+1][j-1:j+2].count(-1)#统计-1的个数
ss=sum(M[i-1][j-1:j+2])+sum(M[i][j-1:j+2])+sum(M[i+1][j-1:j+2])
#print(M[i-1][j-1:j+2],M[i][j-1:j+2],M[i+1][j-1:j+2])
#print(i,j,num,ss)
res.append(int((ss+num)/(9.0-num)))
N.append(res)
return N
评论区答案:
对于四个角,上下边,左右边分别处理(不是碰到一个点判断是不是顶点,边)
class Solution:
def imageSmoother(self, M):
"""
:type M: List[List[int]]
:rtype: List[List[int]]
"""
r, c = len(M), len(M[0]) #记住这种赋值方式
N = [[0 for j in range(c)] for i in range(r)] #还有这种赋值方式
if r == 1:
if c == 1:
return M
N[0][0] = (M[0][0] + M[0][1]) // 2
N[0][c-1] = (M[0][c-1] + M[0][c-2]) // 2
for i in range(1, c-1):
N[0][i] = (M[0][i-1] + M[0][i] + M[0][i+1]) // 3
return N
if c == 1:
N[0][0] = (M[0][0] + M[1][0]) // 2
N[r-1][0] = (M[r-1][0] + M[r-2][0]) // 2
for i in range(1, r-1):
N[i][0] = (M[i-1][0] + M[i][0] + M[i+1][0]) // 3
return N
N[0][0] = (M[0][0] + M[0][1] + M[1][0] + M[1][1]) // 4
N[0][c-1] = (M[0][c-1] + M[0][c-2] + M[1][c-1] + M[1][c-2]) // 4
N[r-1][0] = (M[r-1][0] + M[r-1][1] + M[r-2][0] + M[r-2][1]) // 4
N[r-1][c-1] = (M[r-1][c-1] + M[r-1][c-2] + M[r-2][c-1] + M[r-2][c-2]) // 4
for i in range(1, c-1):
N[0][i] = (M[0][i-1] + M[0][i] + M[0][i+1] + M[1][i-1] + M[1][i] + M[1][i+1]) // 6
N[r-1][i] = (M[r-1][i-1] + M[r-1][i] + M[r-1][i+1] + M[r-2][i-1] + M[r-2][i] + M[r-2][i+1]) // 6
for i in range(1, r-1):
N[i][0] = (M[i-1][0] + M[i][0] + M[i+1][0] + M[i-1][1] + M[i][1] + M[i+1][1]) // 6
N[i][c-1] = (M[i-1][c-1] + M[i][c-1] + M[i+1][c-1] + M[i-1][c-2] + M[i][c-2] + M[i+1][c-2]) // 6
for i in range(1, r-1):
for j in range(1, c-1):
N[i][j] = (M[i-1][j-1] + M[i-1][j] + M[i-1][j+1] + M[i][j-1] + M[i][j] + M[i][j+1] + M[i+1][j-1] + M[i+1][j] + M[i+1][j+1]) // 9
return N