LeetCode 73: Set Matrix Zeroes

LeetCode 73: Set Matrix Zeroes

  • [Problem Link 🔗](#Problem Link 🔗)
  • [Solution Overview 🧭](#Solution Overview 🧭)
  • [Solution 1: Additional Arrays (O(m+n) Space)](#Solution 1: Additional Arrays (O(m+n) Space))
    • [Algorithm Idea](#Algorithm Idea)
    • [Important Points](#Important Points)
    • [Java Implementation](#Java Implementation)
    • [Time & Space Complexity](#Time & Space Complexity)
  • [Solution 2: In-place Marking (O(1) Space)](#Solution 2: In-place Marking (O(1) Space))
    • [Algorithm Idea](#Algorithm Idea)
    • [Important Points](#Important Points)
    • [Java Implementation](#Java Implementation)
    • [Time & Space Complexity](#Time & Space Complexity)
  • [Solution 3: Optimized In-place (Single Variable)](#Solution 3: Optimized In-place (Single Variable))
    • [Algorithm Idea](#Algorithm Idea)
    • [Important Points](#Important Points)
    • [Java Implementation](#Java Implementation)
    • [Time & Space Complexity](#Time & Space Complexity)
  • [Solution Comparison 📊](#Solution Comparison 📊)
  • [Summary 📝](#Summary 📝)

LeetCode 73: Set Matrix Zeroes

Solution Overview 🧭

Given an m x n matrix, if an element is 0, set its entire row and column to 0. You must do it in-place.

Constraints:

m == matrix.length

n == matrix[i].length

1 <= m, n <= 200

-2³¹ <= matrix[i][j] <= 2³¹ - 1

Common approaches include:

Additional Arrays: Use separate arrays to mark rows and columns to be zeroed

In-place Marking: Use first row and first column as markers

Bit Manipulation: Use bits to track rows and columns (for smaller matrices)

Solution 1: Additional Arrays (O(m+n) Space)

Algorithm Idea

Create two boolean arrays: zeroRows and zeroCols

First pass: Mark which rows and columns contain zeros

Second pass: Set matrix elements to zero based on the markers

Important Points

Straightforward and easy to understand

Requires O(m + n) extra space

Time complexity is optimal

Java Implementation

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        
        boolean[] zeroRows = new boolean[m];
        boolean[] zeroCols = new boolean[n];
        
        // Mark rows and columns that contain zeros
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    zeroRows[i] = true;
                    zeroCols[j] = true;
                }
            }
        }
        
        // Set rows to zero
        for (int i = 0; i < m; i++) {
            if (zeroRows[i]) {
                for (int j = 0; j < n; j++) {
                    matrix[i][j] = 0;
                }
            }
        }
        
        // Set columns to zero
        for (int j = 0; j < n; j++) {
            if (zeroCols[j]) {
                for (int i = 0; i < m; i++) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

Time & Space Complexity

Time Complexity: O(m × n)

Space Complexity: O(m + n)

Solution 2: In-place Marking (O(1) Space)

Algorithm Idea

Use first row and first column as markers

Use two additional variables to track if first row/column originally had zeros

First pass: Mark zeros in the first row and column

Second pass: Use markers to set zeros in the rest of the matrix

Finally: Handle first row and column based on the tracking variables

Important Points

Constant extra space (only 2 boolean variables)

More complex logic but space-optimal

Must handle first row/column separately

Java Implementation

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        
        boolean firstRowZero = false;
        boolean firstColZero = false;
        
        // Check if first row has zero
        for (int j = 0; j < n; j++) {
            if (matrix[0][j] == 0) {
                firstRowZero = true;
                break;
            }
        }
        
        // Check if first column has zero
        for (int i = 0; i < m; i++) {
            if (matrix[i][0] == 0) {
                firstColZero = true;
                break;
            }
        }
        
        // Use first row and column as markers
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
        
        // Set zeros based on markers (excluding first row/column)
        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;
                }
            }
        }
        
        // Handle first row
        if (firstRowZero) {
            for (int j = 0; j < n; j++) {
                matrix[0][j] = 0;
            }
        }
        
        // Handle first column
        if (firstColZero) {
            for (int i = 0; i < m; i++) {
                matrix[i][0] = 0;
            }
        }
    }
}

Time & Space Complexity

Time Complexity: O(m × n)

Space Complexity: O(1)

Solution 3: Optimized In-place (Single Variable)

Algorithm Idea

Use first row as column markers

Use a single variable to track if first row has zero

First pass: Set markers and handle first row

Process in reverse order to avoid overwriting markers

Important Points

Most space-efficient (only 1 boolean variable)

Processes matrix from bottom-right to top-left

More complex but optimal for space

Java Implementation

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        
        boolean firstRowHasZero = false;
        
        // Check first row and set markers
        for (int j = 0; j < n; j++) {
            if (matrix[0][j] == 0) {
                firstRowHasZero = true;
            }
        }
        
        // Use first row as column markers
        for (int i = 1; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
            }
        }
        
        // Set zeros from bottom-right to avoid overwriting markers
        for (int i = m - 1; i >= 1; i--) {
            for (int j = n - 1; j >= 0; j--) {
                if (matrix[0][j] == 0 || matrix[i][0] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        
        // Handle first row
        if (firstRowHasZero) {
            for (int j = 0; j < n; j++) {
                matrix[0][j] = 0;
            }
        }
    }
}

Time & Space Complexity

Time Complexity: O(m × n)

Space Complexity: O(1)

Solution Comparison 📊

Summary 📝

Key Insight: Use the matrix itself to store information about which rows/columns need to be zeroed

Recommended Approach: Solution 2 (In-place Marking) provides the best balance between readability and space efficiency

Interview Tip: This problem tests your ability to optimize space usage while maintaining clarity

The in-place marking technique is a common pattern that appears in many matrix manipulation problems, making it valuable to understand thoroughly.

相关推荐
咖啡八杯3 分钟前
GoF设计模式——享元模式
java·spring·设计模式·享元模式
十五喵源码网10 分钟前
基于springboot2+vue2的租房管理系统
java·毕业设计·springboot·论文笔记
摇滚侠11 分钟前
IDEA 创建 Java 项目 手动整合 SSM 框架
java·ide·intellij-idea
源分享11 分钟前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Flittly19 分钟前
【AgentScope Java新手村系列】(10)实战-多Agent天气助手
java·spring boot·spring
李少兄26 分钟前
从原理到实战:Spring IoC/DI 核心知识体系与高频面试题全解
java·后端·spring
何以解忧,唯有..37 分钟前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
飞天狗1111 小时前
零基础JavaWeb入门——第五课第二小节:九大内置对象 · 第2个:response(响应对象)
java·开发语言
许彰午1 小时前
39_Java单元测试JUnit入门
java·junit·单元测试
shushangyun_1 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化