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

矩阵-矩阵置零

矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为0 。请使用 原地 算法。在计算机科学中,一个原地算法(in-place algorithm)是一种使用小的,固定数量的额外之空间来转换资料的算法。当算法执行时,输入的资料通常会被要输出的部分覆盖掉。不是原地算法有时候称为非原地(not-in-place)或不得其所(out-of-place)。

在这里插入图片描述
输入:二维数组
输出:二维数组
思路

方法一:使用两个标记数组
两个标记数组分别记录每一行和每一列是否有零出现,如果出现,则将对应的标记数组置为true,最后再次遍历数组,用标记数组更新原数组即可

class Solution {public void setZeroes(int[][] matrix) {//用变量定义数组的行和列的长度,方便写代码int m = matrix.length;int n = matrix[0].length;//定义标记数组boolean [] row = new boolean[m];boolean [] col = new boolean[n];//对标记数组进行赋值for(int i = 0;i < m;i++){for(int j = 0;j < n;j++){if(matrix[i][j] == 0){row[i] = col[j] = true;}}}//再次遍历,只要有一个标记为true,则置为0for(int i = 0;i < m;i++){for(int j = 0;j < n;j++){if(row[i] || col[j]){matrix[i][j] = 0;}}}}
}

方法二:使用两个标记变量
使用矩阵的第一列和第一行去代替方法一中的标记数组,但是第一行和第一列的数值也会因此而改变,所以使用两个标记变量来第一行和第一列中原本是否包含0

class Solution {public void setZeroes(int[][] matrix) {//用变量定义数组的行和列的长度,方便写代码int m = matrix.length;int n = matrix[0].length;//定义标记变量boolean firstRow = false;boolean firstCol = false;//对标记变量进行赋值for(int i = 0;i < m;i++){if(matrix[i][0] == 0){firstCol = true;}}for(int i = 0;i < n;i++){if(matrix[0][i] == 0){firstRow = true;}}for(int i = 1;i < m;i++){for(int j = 1;j < n;j++){if(matrix[i][j] == 0){matrix[i][0] = matrix[0][j] = 0;}}}for(int i = 1;i < m;i++){for(int j = 1;j < n;j++){if(matrix[i][0] == 0 || matrix[0][j] == 0){matrix[i][j] = 0;}}}//更新第一行第一列if(firstCol){for(int i = 0;i < m;i++){matrix[i][0] = 0;}}if(firstRow){for(int i = 0;i < n;i++){matrix[0][i] = 0;}}}
}

方法三:使用一个标记变量
第一列的第一个元素即可以标记第一行是否出现0。但为了防止每一列的第一个元素被提前更新,我们需要从最后一行开始,倒序地处理矩阵元素。

class Solution {public void setZeroes(int[][] matrix) {//用变量定义数组的行和列的长度,方便写代码int m = matrix.length;int n = matrix[0].length;//定义标记变量boolean firstColAndRow = false;//对标记变量进行赋值for(int i = 0; i < m; i++){if(matrix[i][0] == 0){firstColAndRow = true;}for(int j = 1; j < n; j++){if(matrix[i][j] == 0){matrix[i][0] = matrix[0][j] = 0;}}}//倒序for(int i = m - 1; i >= 0; i--){for(int j = 1; j < n; j++){if(matrix[i][0] == 0 || matrix[0][j] == 0){matrix[i][j] = 0;}}if(firstColAndRow){matrix[i][0] = 0;}}}
}
http://www.lryc.cn/news/540826.html

相关文章:

  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter19-表单脚本
  • 【C# 数据结构】队列 FIFO
  • 论文笔记-WWWCompanion2024-LLM as Data Augmenters for Cold-Start Item Recommendation
  • Java 语法新特性(Records、Pattern Matching、Sealed Classes)深度解析(11/17/21)✨
  • QUdpSocket的readyRead信号只触发一次
  • jsherp importItemExcel接口存在SQL注入
  • 测试data_management函数
  • 微信小程序---计划时钟设计与实现
  • 深度学习之图像回归(二)
  • 深入理解HttpSecurity的设计
  • 15增减字符串匹配(贪心)思路解析+源码
  • Java NIO与传统IO性能对比分析
  • 14.7 LangChain Experimental 模块解析:解锁 Auto-GPT 开发新范式
  • wps中的js开发
  • day16_推荐系统和总结
  • 一文说清楚编码、摘要、加密、公钥、私钥、解密、签名、验签
  • Repeated Sequence
  • CT dicom 去除床板 去除床位,检查床去除
  • react 踩坑记 too many re-renders.
  • YOLOv8与BiFormer注意力机制的融合:提升多场景目标检测性能的研究
  • Ubuntu24.04LTS的下载安装超细图文教程(VMware虚拟机及正常安装)
  • c++贪心系列
  • 爬虫第七篇数据爬取及解析
  • LangChain 技术入门指南:探索语言模型的无限可能
  • 解锁D3.js与PlantUML的交互奥秘:探索知识图谱数据可视化新领域
  • OpenCV机器学习(8)随机森林(Random Forests)算法cv::ml::RTrees类
  • Java四大框架深度剖析:MyBatis、Spring、SpringMVC与SpringBoot
  • MySQL系列之身份鉴别(安全)
  • 纯手工搭建整套CI/CD流水线指南
  • 侯捷 C++ 课程学习笔记:C++ 基础与演化