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

力扣经典算法篇-42-矩阵置零(辅助数组标记法,使用两个标记变量)

1、题干

给定一个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
-231 <= matrix[i][j] <= 231 - 1

2、解题

本题要求,遍历元素,发现为0的元素时,将其列和行均变为0;
注意不能在遍历的过程中同步进行0值的修改。想一下,如果在遍历时就将后面行的元素修改成了0,那么之后行的遍历时,就会将改行全部变为0,进而导致整个列也全部都变成0,最终形成全0的局面。

方法一:(辅助数组标记法)

在第一次遍历数据时,使用辅助数组记住0元素的下标位置。在第二次遍历时,将根据辅助数组的标记进行修改。

代码示例:

import java.util.Arrays;public class Test48 {public static void setZeroes(int[][] matrix) {int rowLen = matrix.length;int colLen = matrix[0].length;boolean[] hasRow = new boolean[rowLen];     // 辅助数组,记录为0的行boolean[] hasCol = new boolean[colLen];     // 辅助数组,记录为0的列for (int i = 0; i < rowLen; i++) {for (int j = 0; j < colLen; j++) {if (matrix[i][j]==0){       // 第一次遍历,填充辅助数组hasRow[i] = true;hasCol[j] = true;}}}for (int i = 0; i < rowLen; i++) {for (int j = 0; j < colLen; j++) {if (hasRow[i] || hasCol[j]){     // 第二次遍历,根据辅助数组进行数据的修改matrix[i][j]=0;}}}}public static void main(String[] args) {int[][] matrix = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};setZeroes(matrix);System.out.println(Arrays.deepToString(matrix));}
}

方法二:(使用两个标记变量)

使用两个变量标记。实际上是方法一节省空间的一种表现。

将第0行和第0列作为辅助空间,先标记在修改元素。但第0行和第0列的元素不能根据被修改后的值进行修改,所以还要添加两个变量先记录第0行和第0列是否包含0的存在。

逻辑顺序:
(1)、先判断第0行和第0列是否包含0,生成对应的标记。
(2)、遍历之后非0行和非0列的元素,使用第0行和第0列作为辅助空间,进行标记。
(3)、再次遍历非0行和非0列的元素,使用第0行和第0列辅助数组空间进行值的修改。
(4)、使用第0行和第0列的标记,对第0行和第0列的元素进行修改。

代码示例:

import java.util.Arrays;public class Test48 {public static void setZeroes(int[][] matrix) {int rowLen = matrix.length;int colLen = matrix[0].length;boolean isFirstRow = false;      // 第0行是否包含0。这里使用第0行作为行辅助空间,进行后续元素的修改参照,最后在根据第0行单独的标记进行该行的修改。boolean isFirstCol = false;      // 第0列是否包含0。这里使用第0列作为列辅助空间,进行后续元素的修改参照,最后在根据第0列单独的标记进行该列的修改。for (int i = 0; i < colLen; i++) {       if (matrix[0][i]==0){              // 第0行是否包含0遍历处理isFirstRow = true; break;}}for (int i = 0; i < rowLen; i++) {if (matrix[i][0]==0){              // 第0列是否包含0遍历处理isFirstCol = true;break;}}// 遍历之后的元素,使用第0行和第0列作为辅助数组标记for (int i = 1; i < rowLen; i++) {for (int j = 1; j < colLen; j++) {// 先标记 if(matrix[i][j]==0){matrix[0][j] = 0;matrix[i][0] = 0;}}}for (int i = 1; i < rowLen; i++) {for (int j = 1; j < colLen; j++) {// 根据标记在进行元素修改if(matrix[i][0]==0 || matrix[0][j]==0){matrix[i][j] = 0;}}}// 根据第0行和第0列的标记,进行第0行和第0列的修改if (isFirstRow){for (int i = 0; i < colLen; i++) {matrix[0][i] = 0;}}if (isFirstCol){for (int i = 0; i < rowLen; i++) {matrix[i][0] = 0;}}}public static void main(String[] args) {int[][] matrix = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}};setZeroes(matrix);System.out.println(Arrays.deepToString(matrix));}
}

向阳前行,Dare To Be!!!

http://www.xdnf.cn/news/16886.html

相关文章:

  • LangChain4J入门:接入大模型
  • 解决飞书文档中PDF文档禁止下载的问题
  • TCP-单线程版本
  • 配置阿里云与云产品流转发
  • LWIP从FreeRTOS到uC/OS-III的适配性改动
  • 多向量检索:lanchain,dashvector,milvus,vestorsearch,MUVERA
  • 嵌入式 C 语言入门:多文件编程实践笔记 —— 从文件创建到调用
  • visual studio code 怎样将主题修改成亮色,并且配置中文界面
  • 基于transformer的目标检测——匈牙利匹配算法
  • 仓库管理系统-14-前端之侧边栏区域Aside的集中式状态管理菜单和动态路由
  • 死锁深度解析:原理、检测与解决之道
  • Spring Boot 整合 Minio 实现高效文件存储解决方案(本地和线上)
  • 【十九、Javaweb-day19-Linux概述】
  • Pytorch 报错-probability tensor contains either ‘inf‘, ‘nan‘ or element < 0 解决方案
  • Odoo OWL前端框架全面学习指南 (后端开发者视角)
  • 机器学习——决策树
  • K8S部署ELK(四):部署logstash
  • JDBC核心技术与预编译SQL实战
  • 2、RabbitMQ的5种模式基本使用(Maven项目)
  • 算法竞赛阶段二-数据结构(39)数据结构栈模拟实现
  • npm ERR! code CERT_HAS_EXPIRED:解决证书过期问题
  • PHP入门及数据类型
  • Noob靶机攻略
  • AI + 云原生:正在引爆下一代应用的技术革命
  • malloc、calloc、realloc
  • deep research|从搜索引擎到搜索助手的实践(一)
  • 西门子PLC基础指令4:输出指令、立即输出指令
  • 【Bluetooth】【基础篇】第二章 关于蓝牙协议栈架构与其硬件方案架构大致概述
  • 12.Redis 主从复制
  • innoDB的buffer pool