【LeetCode】Python实现-661. 图片平滑器

博客围绕图片灰度平滑器展开,给定包含整数的二维矩阵M代表图片灰度,需设计平滑器让每个单元灰度变为平均灰度(向下舍入),通过示例展示计算过程,还给出别人执行用时最短的解答,同时提及一些运算符号的含义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

包含整数的二维矩阵 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

另注:(经常记不清楚)
\ :连接当前行与下一行的字符
/ :除法
//:强行整除
%:取余

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值