import copy
class Solution(object):
def imageSmoother(self, M):
"""
:type M: List[List[int]]
:rtype: List[List[int]]
"""
len_x = len(M)
len_y = len(M[0])
res = copy.deepcopy(M)
for x in range(len_x):
for y in range(len_y):
neighbors = []
for x1 in (x-1,x,x+1):
for y1 in (y-1,y,y+1):
if 0 <= x1 < len_x and 0 <= y1 < len_y:
neighbors.append(M[x1][y1])
res[x][y] = sum(neighbors) // len(neighbors)
return res
0,稍作参考的代码
1,题目要求:
也就是说对于每一个点,用其9*9范围内的所有点的值得和除以一共的点的个数,下取整即可。
2,题目要求其实不多,唯一需要注意的地方便是如何遍历每个点周围所有的点。
遍历过程其实也不难,用for循环遍历并对遍历得到的点进行边界判断即可。但是,一开始定义的res,不管是用res = [[0] * y_len]*x_len来定义,还是用res = M来直接获得,最后的结果都会有问题。
而参考的代码中利用到了一种deepcopy的办法。
对于简单的 object,用 shallow copy 和 deep copy 没区别
复杂的 object, 如 list 中套着 list 的情况,shallow copy 中的 子list,并未从原 object 真的「独立」出来。也就是说,如果你改变原 object 的子 list 中的一个元素,你的 copy 就会跟着一起变。这跟我们直觉上对「复制」的理解不同。
因此,res = M 是 shallow copy
‘‘res[x][y] = sum(neighbors) // len(neighbors) will change neighbors of next M[_x][_y] in M.”
其次,for函数不仅可以定义一个range范围,同时也可以直接定义一个离散的取值范围供变量获得。
最后,/和//都是除法运算,其中//为取整除,即返回商的整数部分。而/在python3 中已经变为浮点数相除了,因此在计算取整相关的除法运算中时,还是要使用//。