[数组基础] 0073. 矩阵置零

文章目录

      • [1. 题目链接](#1. 题目链接)
      • [2. 题目大意](#2. 题目大意)
      • [3. 示例](#3. 示例)
      • [4. 解题思路](#4. 解题思路)
      • [5. 参考代码](#5. 参考代码)

1. 题目链接

0073. 矩阵置零 - 力扣

2. 题目大意

描述:给定一个 m×n 大小的矩阵 matrix。

要求:如果一个元素为 0,则将其所在行和列所有元素都置为 0。

说明

  • 请使用「原地」算法。
  • m==matrix.length。
  • n==matrix0.length。
  • 1≤m,n≤200。
  • −231≤matrixij≤231−1。

进阶:

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

3. 示例

java 复制代码
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
java 复制代码
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

4. 解题思路

  1. 设定两个变量 flag‾row0、flag‾col0 来标记第一行、第一列是否出现了 0。
  2. 接下来我们使用数组第一行、第一列来标记 0 的情况。
  3. 对数组除第一行、第一列之外的每个元素进行遍历,如果某个元素出现 0 了,
    则使用数组的第一行、第一列对应位置来存储 0 的标记。
  4. 再对数组除第一行、第一列之外的每个元素进行遍历,通过对第一行、第一列的标记 0 情况,进行置为 0 的操作。
  5. 最后再根据 flag‾row0、flag‾col0 的标记情况,对第一行、第一列进行置为 0 的操作。

5. 参考代码

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m=matrix.length;
        int n=matrix[0].length;
        boolean flagRow=false;
        boolean flagCol=false;
        
        for(int i=0; i<m; i++){
            if(matrix[i][0] == 0){
                flagCol=true;
            }
        }
        
        for(int j=0; j<n; j++){
            if(matrix[0][j] == 0){
                flagRow=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(flagRow){
            for(int j=0; j<n; j++){
                matrix[0][j]=0;
            }
        }
        
        if(flagCol){
            for(int i=0; i<m; i++){
                matrix[i][0]=0;
            }
        }
    }
}
相关推荐
小星星闪亮登场11 分钟前
Codeforces Round 1115 ( Div. 2)
数据结构·c++·算法·贪心算法·排序算法·codeforces
计算机小白一个11 分钟前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯
Loge编程生活14 分钟前
打卡信奥刷题(3449)用C++实现信奥题 P10429 [蓝桥杯 2024 省 B] 拔河
开发语言·数据结构·c++·算法·青少年编程
2601_957174652 小时前
大模型算法 简单 容易 用这个方法
算法
VALENIAN瓦伦尼安教学设备2 小时前
激光对中仪采购要点
数据库·嵌入式硬件·算法
Forever Nore3 小时前
LeetCode 1 两数之和
算法·leetcode·职场和发展
To_OC4 小时前
LC 3 无重复字符的最长子串:从入门滑动窗口到优化写法,再也不怕面试官追问
javascript·算法·leetcode
(Charon)4 小时前
【C++】多线程死锁:产生原因、复现与解决方法
开发语言·c++·算法
lucas_AI4 小时前
ConfBench:大模型的「我很有把握」,到底能不能信?
人工智能·算法
oier_Asad.Chen5 小时前
【洛谷题解/AcWing题解/真题】洛谷P2330【SCOI2005】繁忙的都市(Kruskal算法的再探究))
c++·算法·贪心算法·图论·最小生成树·kruskal