LeetCode 661. 图片平滑器(python)

题目链接

题目描述:

包含整数的二维矩阵 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值