包含整数的二维矩阵 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]。
别人的解答:
class Solution(object):
def imageSmoother(self, M):
"""
:type M: List[List[int]]
:rtype: List[List[int]]
"""
#padding
m = len(M[0])
N = [[0.5]+i+[0.5] for i in M] #每一行的左右两端各添加一个元素0.5
N = [[0.5]*(m+2)] + N + [[0.5]*(m+2)] #在第一行的上面和最后一行的后面分别添加一行0.5
#卷积
for i in range(1,len(N)-1):
for j in range(1,len(N[0])-1):
total = [N[i-1][j-1],N[i][j-1],N[i+1][j-1],N[i-1][j],N[i][j],N[i+1][j],\
N[i-1][j+1],N[i][j+1],N[i+1][j+1]]
sums,k = 0,0
for _ in total:
if _ != 0.5:
sums += _
else:
k += 1
M[i-1][j-1] = int(sums/(9-k))
return M
执行用时最短的解答:(非常暴力直接啊)
class Solution(object):
def imageSmoother(self, M):
"""
:type M: List[List[int]]
:rtype: List[List[int]]
"""
row,col = len(M),len(M[0])
if row < 2 and col < 2:
return M
if row==1 and col>1:
res = [(M[0][0]+M[0][1])//2]
if col==2:
res.append(res[0])
return [res]
else:
for i in range(1,col-1):
res.append((M[0][i]+M[0][i+1]+M[0][i-1])//3)
res.append((M[0][col-1]+M[0][col-2])//2)
return [res]
if col==1 and row>1:
res = [[(M[0][0]+M[1][0])//2]]
if row ==2:
res.append(res[0])
return res
else:
for i in range(1,row-1):
res.append([(M[i][0]+M[i-1][0]+M[i+1][0])//3])
res.append([(M[row-1][0]+M[row-2][0])//2])
return res
res=[]
for i in range(row):
res.append([0]*col)
for r in range(row):
for c in range(col):
if r==0:
if c==col-1:
res[r][c] = (M[r][c]+M[r+1][c]+M[r][c-1]+M[r+1][c-1])//4
elif c==0:
res[r][c] = (M[r][c]+M[r+1][c]+M[r][c+1]+M[r+1][c+1])//4
else:
res[r][c] = (M[r][c]+M[r+1][c]+M[r][c+1]+M[r+1][c+1]+M[r][c-1]+M[r+1][c-1])//6
elif r==row-1:
if c==col-1:
res[r][c] = (M[r][c]+M[r-1][c]+M[r][c-1]+M[r-1][c-1])//4
elif c==0:
res[r][c] = (M[r][c]+M[r-1][c]+M[r][c+1]+M[r-1][c+1])//4
else:
res[r][c] = (M[r][c]+M[r-1][c]+M[r][c+1]+M[r-1][c+1]+M[r][c-1]+M[r-1][c-1])//6
else:
if c==col-1:
res[r][c] = (M[r][c]+M[r+1][c]+M[r-1][c]+M[r-1][c-1]+M[r][c-1]+M[r+1][c-1])//6
elif c==0:
res[r][c] = (M[r][c]+M[r+1][c]+M[r-1][c]+M[r-1][c+1]+M[r][c+1]+M[r+1][c+1])//6
else:
res[r][c] = (M[r][c]+M[r+1][c]+M[r-1][c]+M[r-1][c+1]+M[r][c+1]+M[r+1][c+1]+M[r-1][c-1]+M[r][c-1]+M[r+1][c-1])//9
return res
另注:(经常记不清楚)
\ :连接当前行与下一行的字符
/ :除法
//:强行整除
%:取余