Python实现矩阵置零

LeetCode- 矩阵置零

题目描述

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。

进阶:

  • 一个直观的解决方案是使用 O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?

示例一:
在这里插入图片描述

示例二:
在这里插入图片描述

思路说明

  • 先对原数组补一圈零,让后对原数据记录下0所在的位置,即:将此位置的bool值设置为True,再遍历填充后的数据,当数据为0且此位置的bool值为True时,将此行此列的数据修改为0。一开始想错题目了,想成了将0所在数据的上下左右修改为0,如果是这样的话,当0在边界时,会出现下标越界的情况,所以才搞的这么复杂,但也实现了。详见代码一
  • 后来发现了自己的错误,想想其实很简单,将数据遍历一遍,遇到0用True来记录,否则用false来记录,这样一来,遍历这个bool类型的数组,值为True时,则修改原数组的所在行和列为0,否则不作修改。详见代码二
    详见代码。欢迎大家批评指正。

代码实现一

class Solution(object):
    def setZeroes(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: None Do not return anything, modify matrix in-place instead.
        """
        import numpy as np
        matrix_arr = np.array(matrix)
        row, col = matrix_arr.shape
        matrix_pad = np.pad(matrix_arr, pad_width=((1, 1), (1, 1)), mode="constant", constant_values=(0, 0))
        
        matrix_bool = []
        for r in range(row):
            for c in range(col):
                if matrix_arr[r][c] == 0:
                    matrix_bool.append(True)
                else:
                    matrix_bool.append(False)
        matrix_bool = np.array(matrix_bool).reshape(row, col)
        matrix_bool = np.pad(matrix_bool, pad_width=((1, 1),(1, 1)), mode="constant",
        constant_values=(False, False))

        for r in range(1, row + 1):
            for c in range(1, col + 1):
                if matrix_pad[r][c] == 0 and matrix_bool[r][c] == True:
                    for index in range(col+1):
                        matrix_pad[r][index] = 0
                    for index in range(row+1):
                        matrix_pad[index][c] = 0

        matrix_result = []
        for r in range(1, row + 1):
            for c in range(1, col + 1):
                matrix[r-1][c-1]=matrix_pad[r][c]
 
        return  matrix

代码实现二

class Solution(object):
    def setZeroes(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: None Do not return anything, modify matrix in-place instead.
        """
        matrix_bool = []
        for r in range(len(matrix)):
            temp_bool=[]
            for c in range(len(matrix[r])):
                if matrix[r][c] == 0:
                    temp_bool.append(True)
                else:
                    temp_bool.append(False)
            matrix_bool.append(temp_bool)
        for r in range(len(matrix_bool)):
            for c in range(len(matrix_bool[r])):
                if matrix_bool[r][c]:
                    for index in range(len(matrix_bool[r])):
                        matrix[r][index] = 0
                    for index in range(len(matrix_bool)):
                        matrix[index][c] = 0
        return matrix

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/set-matrix-zeroes

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Python实现乱,可以使用Arnold变换算法。Arnold变换是一种图像变换方法,可以将有序的图像变成无序的图像,并且具有一定的周期性。这个算法可以通过矩阵相乘的方法实现,通过对图像的像素进行重新排列来实现乱效果。 在Python中,可以使用以下代码实现Arnold乱: ```python import numpy as np def arnold(img): r, c = img.shape p = np.zeros((r, c), np.uint8) a = 1 b = 1 for i in range(r): for j in range(c): x = (i + b * j) % r y = (a * i + (a * b + 1) * j) % c p[x, y = img[i, j] return p ``` 这段代码定义了一个名为`arnold`的函数,它接受一个输入图像`img`作为参数,并返回一个乱后的图像。 对应的,如果要实现逆变换,可以使用以下代码: ```python def dearnold(img): r, c = img.shape p = np.zeros((r, c), np.uint8) a = 1 b = 1 for i in range(r): for j in range(c): x = ((a * b + 1) * i - b * j) % r y = (-a * i + j) % c p[x, y = img[i, j] return p ``` 这段代码定义了一个名为`dearnold`的函数,它接受一个输入图像`img`作为参数,并返回一个逆乱后的图像。 通过调用这两个函数,可以实现图像的乱和逆乱。请注意,代码中的`img`是一个二维矩阵,表示图像的像素值。你可以使用OpenCV等库来加载图像并将其转换为矩阵形式,然后使用这些函数进行乱和逆乱操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [信息隐藏——Python语言幻方实现图片预处理](https://download.csdn.net/download/small_dong_0_o/10433806)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python实现Arnold图像乱算法](https://blog.csdn.net/qq_44754132/article/details/109974735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值