首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

LeetCode Set Matrix Zeroes:常數空間矩陣置零

     編輯:C++ 入門

LeetCode Set Matrix Zeroes:常數空間矩陣置零

給定 m×n 矩陣,若元素為 0,將其所在行列全部置 0。要求原地修改,空間 O(1)。

方法一:兩個標記數組(空間 O(m+n))

void setZeroes(vector<vector<int>>& matrix) {
    int m = matrix.size(), n = matrix[0].size();
    vector<bool> row(m, false), col(n, false);
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            if (matrix[i][j] == 0) row[i] = col[j] = true;
    for (int i = 0; i < m; i++)
        if (row[i]) fill(matrix[i].begin(), matrix[i].end(), 0);
    for (int j = 0; j < n; j++)
        if (col[j])
            for (int i = 0; i < m; i++) matrix[i][j] = 0;
}

方法二:常數空間(利用首行首列作標記)

  1. 先記錄首行、首列是否原本含 0(firstRowZero, firstColZero)。
  2. 遍歷 ,若 matrix[i][j]==0,標記 和 。
  3. 根據首行首列標記,將對應行列置 0(從 1 開始)。
  4. 最後根據 firstRowZero, firstColZero 處理首行首列。
void setZeroesO1(vector<vector<int>>& matrix) {
    int m = matrix.size(), n = matrix[0].size();
    bool firstRowZero = false, firstColZero = false;
    for (int j = 0; j < n; j++) if (matrix[0][j] == 0) { firstRowZero = true; break; }
    for (int i = 0; i < m; i++) if (matrix[i][0] == 0) { firstColZero = true; break; }
    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++)
        if (matrix[i][0] == 0)
            fill(matrix[i].begin(), matrix[i].end(), 0);
    for (int j = 1; j < n; j++)
        if (matrix[0][j] == 0)
            for (int i = 0; i < m; i++) matrix[i][j] = 0;
    if (firstRowZero) fill(matrix[0].begin(), matrix[0].end(), 0);
    if (firstColZero) for (int i = 0; i < m; i++) matrix[i][0] = 0;
}

fill / fill_n 用法補充

  • fill(first, last, val):將迭代器區間 [first, last) 賦值 val。
  • fill_n(first, n, val):從 first 開始賦值 n 個元素。
  • 適用於任意容器(vector, array, 指針等)。
vector<int> v(8);
fill(v.begin(), v.begin()+4, 5);      // 前 4 個置 5
fill_n(v.begin()+3, 3, 8);            // 從第 3 個開始 3 個置 8
// v: 5 5 5 8 8 8 0 0

迭代器 vs 指針

複雜度

  • 時間:O(m*n),三次遍歷矩陣。
  • 空間:O(1),僅用常數額外變量。

此題核心在於「用矩陣自身存儲標記信息」,是原地算法設計的典範,同類思想還適用於「找缺失數字」「數組去重」等問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性指針迭代器
指向對象內存地址容器元素(智能指針)
算術運算支援支援(隨機訪問迭代器)
解引用*p*it 返回引用
輸出cout << p 印地址cout << *it 印值
類型原始類型類類型(封裝指針)