每日一題——矩陣置零問題的原地算法

矩陣置零問題的原地算法

    • 問題描述
      • 示例
      • 約束條件
      • 進階要求
    • 問題分析
      • 難點分析
      • 解題思路
    • 代碼實現
      • 代碼說明
    • 測試用例
      • 測試用例 1
      • 測試用例 2
      • 測試用例 3
    • 總結

問題描述

給定一個 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
  • -2^31 <= matrix[i][j] <= 2^31 - 1

進階要求

  1. 一個直觀的解決方案是使用 O(mn) 的額外空間,但這并不是一個好的解決方案。
  2. 一個簡單的改進方案是使用 O(m + n) 的額外空間,但這仍然不是最好的解決方案。
  3. 能否實現一個僅使用 常量空間 的解決方案?

問題分析

本題要求將矩陣中某些行和列置零,且必須使用原地算法。直接遍歷矩陣并將對應行和列置零會導致信息丟失,因此需要一種方法來標記哪些行和列需要被置零。

難點分析

  1. 標記零的位置:如何在不使用額外矩陣的情況下記錄哪些行和列需要被置零。
  2. 原地修改:在標記完成后,如何在不破壞標記信息的情況下完成置零操作。
  3. 第一行和第一列的特殊情況:如果第一行或第一列本身包含零,直接使用它們作為標記可能會導致誤修改。

解題思路

我們可以通過以下步驟實現原地算法:

  1. 使用第一行和第一列作為標記

    • 遍歷矩陣,如果某個元素為 0,則將該元素所在行的第一個元素和所在列的第一個元素置為 0。這樣,第一行和第一列就成為了標記行和列是否需要置零的“索引”。
  2. 處理第一行和第一列的特殊情況

    • 如果第一行或第一列本身存在 0,則需要額外記錄,因為它們會被用作標記,可能會被誤修改。
  3. 根據標記置零

    • 遍歷第一行和第一列的標記,將對應的行和列置零。
  4. 處理第一行和第一列

    • 最后根據之前記錄的特殊情況,決定是否將第一行和第一列整體置零。

代碼實現

以下是完整的 C 代碼實現:

void setZeroes(int** matrix, int matrixSize, int* matrixColSize) {int firstRowZero = 0;           // 標記第一行是否需要置零int firstColZero = 0;           // 標記第一列是否需要置零// 檢查第一行是否需要置零for (int j = 0; j < *matrixColSize; j++) {if (matrix[0][j] == 0) {firstRowZero = 1;break;}}// 檢查第一列是否需要置零for (int i = 0; i < matrixSize; i++) {if (matrix[i][0] == 0) {firstColZero = 1;break;}}// 使用第一行和第一列作為標記for (int i = 1; i < matrixSize; i++) {for (int j = 1; j < *matrixColSize; j++) {if (matrix[i][j] == 0) {matrix[i][0] = 0;  // 標記該行需要置零matrix[0][j] = 0;  // 標記該列需要置零}}}// 根據標記置零(跳過第一行和第一列)for (int i = 1; i < matrixSize; i++) {for (int j = 1; j < *matrixColSize; j++) {if (matrix[i][0] == 0 || matrix[0][j] == 0) {matrix[i][j] = 0;}}}// 處理第一行if (firstRowZero) {for (int j = 0; j < *matrixColSize; j++) {matrix[0][j] = 0;}}// 處理第一列if (firstColZero) {for (int i = 0; i < matrixSize; i++) {matrix[i][0] = 0;}}
}

代碼說明

  1. 標記邏輯

    • 使用第一行和第一列的元素作為標記,記錄哪些行和列需要被置零。
  2. 特殊情況處理

    • 額外記錄第一行和第一列是否需要被置零,因為它們會被用作標記。
  3. 置零操作

    • 根據第一行和第一列的標記,將對應的行和列置零。
  4. 原地修改

    • 整個過程只使用了常數級別的額外空間,滿足原地算法的要求。

測試用例

以下是幾個測試用例及其結果:

測試用例 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]
]

測試用例 3

輸入:

matrix = [[1, 2, 3, 4],[5, 0, 7, 8],[9, 10, 11, 12]
]

輸出:

[[1, 0, 3, 4],[0, 0, 0, 0],[9, 0, 11, 12]
]

總結

本題通過利用矩陣的第一行和第一列作為標記,實現了原地置零的功能。這種方法不僅滿足了原地算法的要求,還具有較高的效率。時間復雜度為 O(m × n),空間復雜度為 O(1)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72812.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72812.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72812.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Springboot中的@Value注解:用法與潛在問題探索

在Spring Boot開發中&#xff0c;有個非常實用的注解&#xff0c;那就是Value&#xff01;它可以幫助我們輕松地從配置文件中讀取屬性值。想象一下&#xff0c;在應用程序中管理各種配置&#xff0c;比如數據庫連接信息、服務URL或者API密鑰等&#xff0c;使用Value是多么方便呀…

C++后端服務器開發技術棧有哪些?有哪些資源或開源庫拿來用?

一、 C后臺服務器開發是一個涉及多方面技術選擇的復雜領域&#xff0c;特別是在高性能、高并發的場景下。以下是C后臺服務器開發的一種常見技術路線&#xff0c;涵蓋了從基礎到高級的技術棧。 1. 基礎技術棧 C標準庫 C11/C14/C17/C20&#xff1a;使用現代C特性&#xff0c;如…

25年攜程校招社招求職能力北森測評材料計算部分:備考要點與誤區解析

在求職過程中&#xff0c;能力測評是篩選候選人的重要環節之一。對于攜程這樣的知名企業&#xff0c;其能力測評中的材料計算部分尤為關鍵。許多求職者在備考時容易陷入誤區&#xff0c;導致在考試中表現不佳。本文將深入解析材料計算部分的實際考察方向&#xff0c;并提供針對…

golang進階知識專項-理解值傳遞

在 Go 語言中&#xff0c;所有函數的參數傳遞都是值傳遞&#xff08;Pass by Value&#xff09;。當你將一個變量作為參數傳遞給函數時&#xff0c;實際上傳遞的是該變量的副本&#xff0c;而不是變量本身。理解這一點對于避免常見的編程錯誤至關重要。根據不同的類型&#xff…

RuoYi框架添加自己的模塊(學生管理系統CRUD)

RuoYi框架添加自己的模塊&#xff08;學生管理系統&#xff09; 框架順利運行 首先肯定要順利運行框架了&#xff0c;這個我不多說了 設計數據庫表 在ry數據庫中添加表tb_student 表字段如圖所示 如圖所示 注意id字段是自增的 注釋部分是后面成功后前端要展示的部分 導入…

中級網絡工程師面試題參考示例(1)

一、基礎理論 1. OSI七層模型與TCP/IP四層模型的區別是什么&#xff1f;請舉例說明第三層&#xff08;網絡層&#xff09;和第四層&#xff08;傳輸層&#xff09;的核心協議。 參考答案&#xff1a; OSI七層模型分為物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用…

RHCE9.0版本筆記5:防火墻的本地/遠程登錄方式

一、防火墻登錄方式全景圖 華為防火墻支持多種管理訪問方式&#xff0c;根據安全等級和場景需求可分為&#xff1a; graph LR A[管理方式] --> B[本地登錄] A --> C[遠程登錄] B --> B1(Console) B --> B2(Web) C --> C1(SSH) C --> C2(Telnet) C --> C…

2025最新群智能優化算法:山羊優化算法(Goat Optimization Algorithm, GOA)求解23個經典函數測試集,MATLAB

一、山羊優化算法 山羊優化算法&#xff08;Goat Optimization Algorithm, GOA&#xff09;是2025年提出的一種新型生物啟發式元啟發式算法&#xff0c;靈感來源于山羊在惡劣和資源有限環境中的適應性行為。該算法旨在通過模擬山羊的覓食策略、移動模式和躲避寄生蟲的能力&…

博弈論算法

一、減法游戲 初始有一個數 n。 兩個玩家輪流操作&#xff0c;每次可以減去 1 到 9 之間的任意整數。 將數減到 0 的玩家獲勝。 可以發現規律&#xff1a; 減法游戲只需要判斷當前數取模是否為0&#xff0c;即可快速判斷勝負。 例題&#xff1a; Leetcode 292. Nim 游戲 …

Excel·VBA江西省預算一體化工資表一鍵處理

每月制作工資表導出為Excel后都需要調整格式&#xff0c;刪除0數據的列、對工資表項目進行排序、打印設置等等&#xff0c;有些單位還分有“行政”、“事業”2個工資表就需要操作2次。顯然&#xff0c;這種重復操作的問題&#xff0c;可以使用VBA代碼解決 目錄 代碼使用說明1&a…

深度學習驅動的跨行業智能化革命:技術突破與實踐創新

第一章 深度學習的技術范式演進與核心架構 1.1 從傳統機器學習到深度神經網絡的跨越 深度學習的核心在于通過多層次非線性變換自動提取數據特征,其發展歷程可劃分為三個階段:符號主義時代的規則驅動(1950s-1980s)、連接主義時代的淺層網絡(1990s-2000s)以及深度學習時代…

嵌入式學習筆記-卡爾曼濾波,PID,MicroPython

文章目錄 卡爾曼濾波卡爾曼濾波的核心思想卡爾曼濾波的數學模型1. 狀態轉移模型&#xff08;預測系統狀態&#xff09;2. 觀測模型&#xff08;預測測量值&#xff09; 卡爾曼濾波的五個關鍵步驟1. 預測狀態2. 預測誤差協方差3. 計算卡爾曼增益4. 更新狀態5. 更新誤差協方差 卡…

一周熱點-文本生成中的擴散模型- Mercury Coder

一、背景知識 在人工智能領域&#xff0c;文本生成模型一直是研究的熱點。傳統的大型語言模型多采用自回歸架構&#xff0c;從左到右逐個預測下一個標記。這種模型雖然在生成連貫文本方面表現出色&#xff0c;但在速度上存在一定的局限性&#xff0c;因為它需要按順序生成每個標…

Qt調試功能使用方法

QT編程環境 QT在Windows操作系統下的三種編程環境搭建。 方案編程環境編譯器調試器1Qt CreatorMinGW GCCGDB2Qt CreatorMicrosoft Visual C CompilerDebugging Tools for Widows3Microsoft Visual Studio VS自帶VS自帶 方案提及的QT安裝程序及壓縮包均能在官網Index of /off…

vulnhub靶場之【digitalworld.local系列】的mercy靶機

前言 靶機&#xff1a;digitalworld.local-mercy&#xff0c;IP地址為192.168.10.11 攻擊&#xff1a;kali&#xff0c;IP地址為192.168.10.6 kali采用VMware虛擬機&#xff0c;靶機選擇使用VMware打開文件&#xff0c;都選擇橋接網絡 這里官方給的有兩種方式&#xff0c;一…

Fiddler抓取App接口-Andriod/IOS配置方法

Andriod配置方法&#xff1a; 1&#xff09;確保手機和Fiddler所在主機在同一個局域網中 2&#xff09;獲取Fiddler所在主機的ip地址&#xff0c;通過cmd命令進入命令編輯器&#xff0c;輸入ipconfig -all&#xff0c;找到IPv4地址&#xff0c;記下該地址 3&#xff09;對手機…

步進電機軟件細分算法解析與實踐指南

1. 步進電機細分技術概述 步進電機是一種將電脈沖信號轉換為角位移的執行機構&#xff0c;其基本運動單位為步距角。傳統步進電機的步距角通常為 1.8&#xff08;對應 200 步 / 轉&#xff09;&#xff0c;但在高精度定位場景下&#xff0c;這種分辨率已無法滿足需求。細分技術…

C語言_數據結構總結2:動態分配方式的順序表

0——靜態分配內存的順序表和動態分配內存的順序表的相同之處和不同之處 相同之處 基本操作邏輯相同&#xff1a;無論是靜態分配還是動態分配的順序表&#xff0c;其核心的操作邏輯是一致的。例如插入操作都需要將插入位置之后的元素依次后移&#xff0c;刪除操作都需要將刪除…

Vue 與 Element UI 深度探秘:從 Array.isArray 到動態綁定的技術之旅!?

以下是一篇深入的技術博客&#xff0c;基于我們對 compare-form.vue 和 <w-form-select.vue> 的所有討論&#xff0c;涵蓋 Array.isArray、option-label/option-value、:list 動態綁定、: 語法以及 Vue 2/3 兼容性等問題。博客風格輕松有趣&#xff0c;加入 SVG 圖解和實…

計算機視覺|3D卷積網絡VoxelNet:點云檢測的革新力量

一、引言 在科技快速發展的背景下&#xff0c;3D 目標檢測技術在自動駕駛和機器人領域中具有重要作用。 在自動駕駛領域&#xff0c;車輛需實時、準確感知周圍環境中的目標物體&#xff0c;如行人、車輛、交通標志和障礙物等。只有精確檢測這些目標的位置、姿態和類別&#x…