Skip to main content

Command Palette

Search for a command to run...

LeetCode 73. Set Matrix Zeroes

Published
•3 min read•View as Markdown
R

I’m currently learning and improving my skills in computer science. I have a strong interest in subjects like mathematics, object-oriented programming using C++, and data structures. I’m also eager to explore more about: Algorithms Computer Architecture Operating Systems Computer Networking I practice coding and problem-solving regularly on websites like LeetCode.com, GeeksforGeeks.org, and Programiz.pro. These help me apply what I learn and improve my coding skills. In my free time, I enjoy watching movies. It helps me relax and also gives me new ideas and ways of thinking. I’m always curious and love learning new things. I enjoy setting goals and working hard to achieve them. I’m looking for opportunities where I can keep learning, write code, and be part of projects that encourage new ideas and creative thinking. A few things about me: I learn quickly I have strong basic coding skills I like finishing what I start I’m curious and always ask questions I work hard and manage my time well I’m open to feedback and new ways of doing things

Implementations are provided below:

alt

Brute-Force Code:

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int rows = matrix.size();
        if (rows == 0) return;
        int cols = matrix[0].size();

        // Create two arrays to mark which rows and columns to be made zeroes
        vector<bool> zeroRows(rows, false);
        vector<bool> zeroCols(cols, false);

        // 1. Finding Zeroes: find zeroes and mark their rows and cols
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                // If we find the zero, we need to remember its row and col
                if (matrix[i][j] == 0) {
                    zeroRows[i] = true;
                    zeroCols[j] = true;
                }
            }
        }

        // 2. Setting Zeroes: set all marked rows and cols to zero
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++) {
                // If this cell is in a marked row OR col, set it to zero
                if (zeroRows[i] || zeroCols[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
};

Optimized Code:

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int rows = matrix.size();
        if (rows == 0) return;
        int cols = matrix[0].size();

        bool firstRowHasZero = false;
        bool firstColHasZero = false;

        // Step 1: Check if the first row or column has a zero
        for (int col = 0; col < cols; col++) {
            // If the first row has a zero, flag it to true
            if (matrix[0][col] == 0) {
                firstRowHasZero = true;
                break;
            } 
        }   

        for (int row = 0; row < rows; row++) {
            // If the first row has a zero, flag it to true
            if (matrix[row][0] == 0) {
                firstColHasZero = true;
                break;
            } 
        }

        // Step 2: Use rest of the matrix to mark zeroes
        for (int i = 1; i < rows; i++) {
            for (int j = 1; j < cols; j++) {
                // If we see a zero at any cell, mark its row's first cell and column's first cell
                if (matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }

        // Step 3: Make the cell zero based on the marks
        for (int i = 1; i < rows; i++) {
            for (int j = 1; j < cols; j++) {
                // the cell at (i, j) if it's row's first cell or column's first cell is zero
                if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0; // Make that cell zero
                }
            }
        }

        // Step 4: Make first row or first column zero if needed
        if (firstRowHasZero) {
            // If yes, make the first entire row zero
            for (int col = 0; col < cols; col++) {
                matrix[0][col] = 0;
            }
        }

        if (firstColHasZero) {
            // If yes, make the first entire column zero
            for (int row = 0; row < rows; row++) {
                matrix[row][0] = 0;
            }
        }
    }
};