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

力扣经典算法篇-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.dtcms.com/a/312538.html

相关文章:

  • 使命召唤21:黑色行动6 免安 离线 中文版
  • 1.8 axios详解
  • Axios介绍
  • 一键安装RabbitMQ脚本
  • ESP32学习-I2C(IIC)通信详解与实践
  • 线程锁-互斥、自旋、读写、原子操作、线程池
  • [硬件电路-147]:模拟电路 - DC/DC电压的三种架构:升压(Boost)、降压(Buck)或升降压(Buck-Boost)
  • GLM-4.5 解读:统一推理、编码与智能体的全能王
  • 利用AI渲染技术提升元宇宙用户体验的技术难点有哪些?
  • 微分方程模型:用“变化率”的语言,描绘世间万物的动态演化
  • 文本换行问题
  • [每周一更]-(第153期):**PDF终极防护指南:命令行全栈加密+一键权限锁死实战(附脚本模板)**
  • 前端JS-调用单删接口来删除多个选中文件
  • 前端 拼多多4399笔试题目
  • Spring 03 Web springMVC
  • 如何查看SoC线程的栈起始地址及大小
  • leecode2962 统计最大元素出现至少K次的子数组
  • 第12届蓝桥杯Scratch图形化【省赛】初级组 2021年4月24日
  • 从Docker衔接到导入黑马商城以及前端登录显示用户或密码错误的相关总结(个人理解,仅供参考)
  • 从传热学基础到有限元弱形式推导:拆解热传导问题Matlab有限元离散核心
  • C++ 信号处理
  • 【AI编程工具IDE/CLI/插件专栏】-国外IDE与Cursor能力对比
  • 【从零开始速通C语言1】 - 汇编语言1
  • 西门子PLC基础指令4:输出指令、立即输出指令
  • 信用衍生工具
  • 《基于特征融合的小目标检测方法及其在医学影像领域的应用研究》论文解析
  • Coin Combinations I(Dynamic Programming)
  • ThinkPHP 与 Vue.js 结合的全栈开发模式
  • 多线程(三)-线程安全原因与解决
  • Day26-二叉树的最小深度