算法73. 矩陣置零

給定一個 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]]

解法:

class Solution:def setZeroes(self, matrix: List[List[int]]) -> None:"""Do not return anything, modify matrix in-place instead."""if not matrix or not matrix[0]:returnm,n=len(matrix),len(matrix[0])# 1. 檢查第一行/第一列是否原本就有0first_row_has_zero = any(matrix[0][j]==0 for j in range(n))first_col_has_zero = any(matrix[i][0]==0 for i in range(m))# 2. 用第一行和第一列作為“標記數組”# 也就是把要置為0的行列標記出來for i in range(1,m):for j in range(1,n):if matrix[i][j]==0:matrix[i][0] = 0matrix[0][j] = 0# 3. 根據標記,把中間部分(非第一行/列)置零for i in range(1,m):if matrix[i][0] == 0:# 找到要置零的行,全部置零for j in range(1,n):matrix[i][j] = 0for j in range(1,n):if matrix[0][j] == 0:for i in range(1,m):matrix[i][j] = 0# 4. 最后再處理第一行和第一列if first_row_has_zero:for j in range(n):matrix[0][j] = 0if first_col_has_zero:for i in range(m):matrix[i][0] = 0 

使用5x5的矩陣來完整演示這個算法的每一步執行過程如下:


📌 示例矩陣:

原始矩陣:
[[ 1,  2,  3,  4,  5],[ 6,  7,  0,  8,  9],[10, 11, 12, 13, 14],[15,  0, 16, 17, 18],[19, 20, 21, 22, 23]
]

目標:如果某個元素是 0,就把它所在的整行和整列都設為 0。

我們使用 O(1) 空間優化算法(用第一行/列做標記)。


? 步驟 1:判斷第一行和第一列是否原本有 0

first_row_has_zero = any(matrix[0][j] == 0 for j in range(5))False
first_col_has_zero = any(matrix[i][0] == 0 for i in range(5))False

第一行:[1,2,3,4,5] → 沒有 0
第一列:[1,6,10,15,19] → 沒有 0

? 所以最后我們不會主動清零第一行和第一列,除非標記需要。


? 步驟 2:用第一行和第一列作為“標記位”

我們從 (1,1) 開始掃描(跳過第一行和第一列),發現 0 就在 matrix[i][0]matrix[0][j] 打標記。

for i in range(1, 5):for j in range(1, 5):if matrix[i][j] == 0:matrix[i][0] = 0      # 標記第 i 行要清零matrix[0][j] = 0      # 標記第 j 列要清零

我們找到兩個 0:

  1. matrix[1][2] == 0 → 第1行第2列是0

    • matrix[1][0] = 0 → 標記第1行要清零
    • matrix[0][2] = 0 → 標記第2列要清零
  2. matrix[3][1] == 0 → 第3行第1列是0

    • matrix[3][0] = 0 → 標記第3行要清零
    • matrix[0][1] = 0 → 標記第1列要清零

👉 打完標記后,矩陣變成:

[[ 1,  0,  0,  4,  5],   ← matrix[0][1]=0(第1列要清零),matrix[0][2]=0(第2列要清零)[ 0,  7,  0,  8,  9],   ← matrix[1][0]=0(第1行要清零)[10, 11, 12, 13, 14],[ 0,  0, 16, 17, 18],   ← matrix[3][0]=0(第3行要清零)[19, 20, 21, 22, 23]
]

🔔 注意:我們故意修改了第一行和第一列,把它們當作“標記墻”。


? 步驟 3:根據標記清零“中間部分”(非第一行/列)

① 清零被標記的行(從第1行開始)

for i in range(1, 5):if matrix[i][0] == 0:   # 第 i 行被標記了for j in range(1, 5):  # 把 j ≥ 1 的列清零matrix[i][j] = 0
  • i=1: matrix[1][0]==0 → 清零 matrix[1][1]matrix[1][4]
  • i=3: matrix[3][0]==0 → 清零 matrix[3][1]matrix[3][4]

當前矩陣:

[[ 1,  0,  0,  4,  5],[ 0,  0,  0,  0,  0],   ← 第1行清零(除了 matrix[1][0] 已是0)[10, 11, 12, 13, 14],[ 0,  0,  0,  0,  0],   ← 第3行清零[19, 20, 21, 22, 23]
]

② 清零被標記的列(從第1列開始)

for j in range(1, 5):if matrix[0][j] == 0:   # 第 j 列被標記了for i in range(1, 5):  # 把 i ≥ 1 的行清零matrix[i][j] = 0
  • j=1: matrix[0][1]==0 → 清零第1列(i=1 到 4)
  • j=2: matrix[0][2]==0 → 清零第2列(i=1 到 4)

注意:matrix[1][1], [1][2], [3][1], [3][2] 已是 0,但其他也要清:

  • 第1列:matrix[2][1], matrix[4][1] → 設為 0
  • 第2列:matrix[2][2], matrix[4][2] → 設為 0

當前矩陣:

[[ 1,  0,  0,  4,  5],[ 0,  0,  0,  0,  0],[10,  0,  0, 13, 14],   ← matrix[2][1] 和 [2][2] 被清零[ 0,  0,  0,  0,  0],[19,  0,  0, 22, 23]    ← matrix[4][1] 和 [4][2] 被清零
]

? 步驟 4:最后處理第一行和第一列

if first_row_has_zero:False → 不清零第一行for j in range(5): matrix[0][j] = 0if first_col_has_zero:False → 不清零第一列for i in range(5): matrix[i][0] = 0

所以第一行和第一列保持原樣。


? 最終結果:

[[ 1,  0,  0,  4,  5],[ 0,  0,  0,  0,  0],[10,  0,  0, 13, 14],[ 0,  0,  0,  0,  0],[19,  0,  0, 22, 23]
]

? 驗證是否正確?

原始 0 的位置:

  • (1,2) → 第1行、第2列 → 應清零 → ?
  • (3,1) → 第3行、第1列 → 應清零 → ?

結果:

  • 第1行全0 → ?
  • 第3行全0 → ?
  • 第1列:matrix[i][1] 全為0(i≥1)→ ?
  • 第2列:matrix[i][2] 全為0(i≥1)→ ?
  • 第一行和第一列未被誤清 → ?

? 總結:算法全過程

步驟操作目的
1檢查第一行/列是否有 0保存原始信息
2掃描內部,用 matrix[i][0]matrix[0][j] 打標記空間復用,O(1)
3根據 matrix[i][0]==0 清零行讀標記,清零中間行
4根據 matrix[0][j]==0 清零列讀標記,清零中間列
5最后根據 first_row/col_has_zero 清零第一行/列保證完整性

💡 關鍵點回顧

  • matrix[i][0] == 0 確實是被前面改過的,但這是設計好的標記機制
  • 我們不是在“錯誤地讀修改后的值”,而是在“正確地讀標記”
  • 這就是 O(1) 空間解法的精髓用矩陣自己當哈希表

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

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

相關文章

【力扣22】括號生成

數字n代表生成括號的對數&#xff0c;請你設計一個函數&#xff0c;用于能夠生成所有可能的并且有效的括號組合。 源代碼&#xff1a; class Solution { public:int n;vector<string> ans;string path;vector<string> generateParenthesis(int n) {this->n n;d…

ELK分布式日志采集系統

* 系統架構&#xff1a;filebeat 采集各服務器日志&#xff1b;Logstash-docker 過濾整理日志&#xff1b; Elasticsearch-docker 存儲和索引數據&#xff1b; Kibana-docker 提供可視化展示和操作。* FileBeat簡介&#xff1a;Filebeat是本地文件的日志數據采集器。* Kafka簡介…

Python生產環境部署指南:專業級應用啟動方案

在生產環境中部署Python應用需要考慮穩定性、性能和安全性。本文將詳細介紹多種專業部署方案,助你構建可靠的生產環境。 一、核心部署架構 標準Python生產環境包含三個核心組件: 應用服務器:運行Python代碼(Gunicorn/uWSGI/Uvicorn) 進程管理器:保障服務持續運行(Supe…

C語言:結構體、共用體與枚舉詳解

在 C 語言編程中&#xff0c;結構體&#xff08;struct&#xff09;、共用體&#xff08;union&#xff09;與枚舉&#xff08;enum&#xff09;是三種非常重要的用戶自定義數據類型。它們能幫助我們更好地組織、管理和表達復雜的數據結構。本文將結合實例&#xff0c;深入介紹…

Linux Web服務器與WordPress部署筆記

web服務器 nginx 配置基本認證 用戶名和密碼使用plain text發送&#xff0c;所以最好配置SSL/TLS。 # 安裝工具[rootserver ~ 09:21:43]# yum -y install httpd-tools[rootserver ~ 09:28:30]# vim /etc/nginx/conf.d/ssl.confserver {?location /auth-basic/ {auth_basic …

貪心----3. 跳躍游戲 II

45. 跳躍游戲 II - 力扣&#xff08;LeetCode&#xff09; /** 維護變量: max_reachable,遍歷過的元素的最遠可達位置 end,當前區間終點(隨max_reachable變化) 遍歷過程: 遍歷時迭代遍歷過的元素最遠可達位置,利用end記錄當前區間終點(隨max_reachable變化) 當移動至end即當前…

RabbitMQ面試精講 Day 13:HAProxy與負載均衡配置

【RabbitMQ面試精講 Day 13】HAProxy與負載均衡配置 開篇 歡迎來到"RabbitMQ面試精講"系列的第13天&#xff01;今天我們將聚焦RabbitMQ集群架構中的關鍵組件——HAProxy及其負載均衡配置。在大型分布式系統中&#xff0c;如何實現RabbitMQ集群的高可用和負載均衡是…

C# 中常用集合以及使用場景

1. 數組 (Array)??特點?&#xff1a;固定大小、內存連續、訪問速度快?使用場景?&#xff1a;需要高性能的固定大小集合數值計算&#xff08;如矩陣運算&#xff09;存儲已知長度的數據&#xff08;如配置文件參數&#xff09;?2. List<T>??特點?&#xff1a;動態…

量化實戰學習 Day 2:雙均線策略實現與回測分析

一、前言在完成第一天的環境搭建和基礎認知后&#xff0c;今天將進入真正的策略開發環節。本文將記錄我從數據處理到第一個量化策略實現的全過程&#xff0c;包含完整的代碼示例和深度思考。二、復習與環境檢查1.1 環境復查首先確認了Day 1搭建的環境運行正常&#xff1a; cond…

ubuntu 安裝內核模塊驅動 DKMS 介紹

DKMS&#xff08;Dynamic Kernel Module Support&#xff0c;動態內核模塊支持&#xff09;是一個用于管理 Linux 內核模塊的工具&#xff0c;主要作用是在系統內核更新時&#xff0c;自動重新編譯和安裝依賴于特定內核版本的驅動程序&#xff08;內核模塊&#xff09;&#xf…

adb使用指南

adb使用指南一、介紹二、連接一、有線連接方式二、無線連接方式**Android 10及以下版本****Android 11及以上版本**三、指令1、設備連接管理2、應用調試3、文件傳輸4、系統控制6、日志分析7、其他速查表總結python腳本實例&#xff1a;提示&#xff1a;以下是本篇文章正文內容&…

C語言實戰:二級指針與文件操作的完美邂逅——動態管理文件數據

資料合集下載鏈接: ?https://pan.quark.cn/s/472bbdfcd014? 在上一篇文章中,我們探討了二級指針作為函數“輸出特性”的強大功能。今天,我們將更進一步,通過一個完整的實戰項目,將二級指針與文件I/O操作結合起來,學習如何動態、高效地讀取和管理文件內容。 這個項目…

低代碼開發實戰案例,如何通過表單配置實現數據輸入、數據存儲和數據展示?

JVS低代碼輕應用快速開發采用所見即所得的配置思路&#xff0c;表單是低代碼中最基礎的業務配置引擎之一&#xff0c;快速的通過表單配置實現數據輸入、數據存儲&#xff0c;數據展示。那么在輕應用下直接點開菜單打開的表單&#xff0c;錄入數據提交到數據模型&#xff0c;后續…

數字孿生系統讓汽車工廠虛實聯動預測維護少停機

在汽車制造行業&#xff0c;設備突發停機往往會引發連鎖反應&#xff0c;導致生產中斷、成本飆升。傳統運維模式依賴人工巡檢與事后維修&#xff0c;難以應對復雜生產場景下的設備管理需求。如今&#xff0c;數字孿生系統憑借虛實聯動的核心能力&#xff0c;為汽車工廠打造預測…

iceberg1.2.0 修改表與覆蓋寫

版本iceberg 1.2.0修改表只支持HiveCatalog表修改表屬性&#xff0c;Iceberg表屬性和Hive表屬性存儲在HMS中是同步的修改外部表刪表時是否刪除數據的表屬性&#xff0c;這里是修改為刪除表時不刪除數據alter table iceberg_test1 set TBLPROPERTIES(external.table.purgeFALSE)…

Mini-Omni: Language Models Can Hear, Talk While Thinking in Streaming

2024.8tsinghuamethodwhisper encoder: whisper smallLLM Qwen0.5b init預測方式&#xff1a;text 7*audio token&#xff0c; parallel generation的方式預測&#xff0c;delay-step1----先預測文本token&#xff0c;再預測SNAC 第一級碼本&#xff0c;然后序列化的逐漸預測后…

【MATLAB例程】基于UKF的IMM例程,模型使用CA(勻加速)和CT(協調轉彎)雙模型,二維環境下的軌跡定位。附代碼下載鏈接

本文介紹的MATLAB程序可以實現&#xff1a;基于交互式多模型&#xff08;IMM&#xff09;的無跡卡爾曼濾波&#xff08;UKF&#xff09;方法&#xff0c;用于二維平面中目標的運動狀態估計。該算法結合了兩個運動模型&#xff1a;勻速直線模型&#xff08;CV&#xff09;和勻速…

工廠智慧設備檢測:多模態算法提升工業安全閾值

工廠智慧設備檢測&#xff1a;從技術突破到場景化落地在工業4.0與智能制造的雙重驅動下&#xff0c;工廠設備檢測正經歷從人工巡檢到智能化監控的顛覆性變革。傳統檢測方式受限于人力成本、環境干擾及響應延遲&#xff0c;難以滿足現代工廠對安全性、效率與可持續性的要求。而基…

復現論文《地形遮擋對GNSS干擾范圍影響的高效仿真算法》

地形遮擋對GNSS干擾范圍影響的高效仿真算法 1. 論文標題 論文標題為《地形遮擋對GNSS干擾范圍影響的高效仿真算法》 2. 內容概括 該論文提出了一種高效計算地形遮擋對全球導航衛星系統(GNSS)干擾源干擾范圍影響的新算法。傳統基于視線可視域分析的方法存在大量冗余計算,本…

圖論(2)算法之拓撲排序介紹

目錄 一、什么是拓撲排序&#xff1f; 二、拓撲排序的算法實現 1 BFS算法實現 &#xff08;1&#xff09;算法思路 &#xff08;2&#xff09; 代碼實現&#xff08;Java&#xff09; 2 DFS算法實現 &#xff08;1&#xff09;算法思路 &#xff08;2&#xff09; 代碼實…