当前位置: 首页 > article >正文

73.矩阵置零 python

矩阵置零

  • 题目
    • 题目描述
    • 示例 1:
    • 示例 2:
    • 提示:
  • 题解
    • 思路分析
    • Python 实现代码
    • 代码解释
    • 提交结果

题目

题目描述

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

示例 1:

在这里插入图片描述

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

示例 2:

在这里插入图片描述

输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

提示:

m == matrix.length
n == matrix[0].length
1 <= m, n <= 200
- 2 31 2^{31} 231 <= matrix[i][j] <= 2 31 2^{31} 231 - 1

题解

思路分析

为了在不使用额外空间的情况下完成这个任务,我们可以利用矩阵的第一行和第一列来记录哪些行和列需要被置零。具体步骤如下:

  1. 检查第一行和第一列是否有零:我们需要单独检查第一行和第一列中是否包含零,因为稍后我们会用它们来存储其他行和列的信息。
  2. 标记需要置零的行和列:遍历整个矩阵,当发现某个元素为零时,将该元素所在的行的第一个元素和该元素所在的列的第一个元素设置为零。
  3. 根据标记置零:再次遍历矩阵(从最后一行开始,以避免覆盖第一行和第一列中的标记),如果某一行或某一列的第一个元素为零,则将整行或整列置零。
  4. 处理第一行和第一列:最后,根据第一步的结果决定是否需要将第一行或第一列置零。

Python 实现代码

def setZeroes(matrix):
    m, n = len(matrix), len(matrix[0])
    
    # Step 1: Check if the first row and first column contain zeros
    first_row_has_zero = any(matrix[0][j] == 0 for j in range(n))
    first_col_has_zero = any(matrix[i][0] == 0 for i in range(m))
    
    # Step 2: Mark rows and columns that need to be zeroed
    for i in range(1, m):
        for j in range(1, n):
            if matrix[i][j] == 0:
                matrix[i][0] = 0
                matrix[0][j] = 0
    
    # Step 3: Set matrix elements to zero based on marks
    for i in range(1, m):
        for j in range(1, n):
            if matrix[i][0] == 0 or matrix[0][j] == 0:
                matrix[i][j] = 0
    
    # Step 4: Handle first row and column
    if first_row_has_zero:
        for j in range(n):
            matrix[0][j] = 0
    if first_col_has_zero:
        for i in range(m):
            matrix[i][0] = 0

代码解释

  1. 检查第一行和第一列:通过 any 函数检查第一行和第一列中是否存在零,并保存结果。
  2. 标记需要置零的行和列:遍历矩阵,对于每个为零的元素,将其对应的行首和列首元素也设为零。
  3. 根据标记置零:从矩阵的最后一个元素开始向前遍历,如果某一行或某一列的标志位为零,则将该行或该列的所有元素置零。
  4. 处理第一行和第一列:最后根据第一步的检查结果决定是否需要将第一行或第一列置零。

这种方法确保了我们只使用常数级别的额外空间(O(1)),并且有效地完成了原地算法的要求。

提交结果

在这里插入图片描述


http://www.kler.cn/a/500067.html

相关文章:

  • 在 Flownex 网络中创建传热元件
  • 【excel】VBA简介(Visual Basic for Applications)
  • 注册中心如何选型?Eureka、Zookeeper、Nacos怎么选
  • Android实战经验篇-增加系统分区
  • 基于mybatis-plus历史背景下的多租户平台改造
  • 代码随想录算法训练营第3天(链表1)| 203.移除链表元素 707.设计链表 206.反转链表
  • EJB与微服务:Java的秘密武器
  • go oom堆内存分析
  • 论文导读 | 可串行化事务机制
  • LayaAir3.2来了:性能大幅提升、一键发布安装包、支持WebGPU、3D导航寻路、升级为真正的全平台引擎
  • web网页设 web网页设计,html页面制作,div布局 css js
  • 安全运维管理 10.2资产管理
  • Kubernetes 服务发现与负载均衡
  • Kotlin | Android Provider 的实现案例
  • PHP获取局域网ip(192.168)
  • 第三十六章 C++ 多线程
  • 第5天:APP应用微信小程序原生态开发H5+Vue技术封装打包反编译抓包点
  • 转运机器人在物流仓储行业的优势特点
  • 大数据智能选课系统
  • day07_Spark SQL
  • 【技术支持】安卓无线adb调试连接方式
  • RepPoints: Point Set Representation for Object Detection—用于目标检测的点集表示
  • Python的秘密基地--[章节11] Python 性能优化与多线程编程
  • 简单说一下 类
  • 地下苹果(马铃薯)怎么破局?