【LeetCode 熱題 100】73. 矩陣置零——(解法一)空間復雜度 O(M + N)

Problem: 73. 矩陣置零
題目:給定一個 m x n 的矩陣,如果一個元素為 0 ,則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。

文章目錄

  • 整體思路
  • 完整代碼
  • 時空復雜度
    • 時間復雜度:O(M * N)
        • 空間復雜度:O(M + N)

整體思路

這段代碼旨在解決 “矩陣置零” 問題,它通過 HashSet 來存儲需要置零的行和列的索引,并在一個統一的階段完成置零操作。

算法的整體思路是 “先標記,后置零”

  1. 第一階段:使用 HashSet 進行標記

    • 算法創建了兩個哈希集合(HashSetrowcol
    • 優勢:使用 HashSet 而不是 List 有兩個好處:
      a. 自動去重HashSet 內部保證了元素的唯一性。即使一行或一列有多個 0,其索引也只會被存儲一次,這使得存儲空間更為緊湊。
      b. 高效查找HashSet 提供了平均時間復雜度為 O(1) 的 contains 操作,這在第二階段的置零操作中會非常高效。
    • 通過一次完整的雙層循環遍歷矩陣,當遇到 matrix[i][j] == 0 時,就將行號 i 和列號 j 分別添加到 rowcol 集合中。
  2. 第二階段:統一置零

    • 它再次遍歷整個矩陣的每一個位置 (i, j)
    • 對于每個元素 matrix[i][j],它會檢查:當前元素的行號 i 是否在 row 集合中,或者其列號 j 是否在 col 集合中 (row.contains(i) || col.contains(j))。
    • 如果上述條件滿足,就說明該元素位于一個需要被清零的行或列,因此將其值設置為 0。

完整代碼

class Solution {/*** 將矩陣中包含 0 的元素的整行和整列都置為 0。* @param matrix 一個 M x N 的整數矩陣*/public void setZeroes(int[][] matrix) {// 獲取矩陣的行數和列數int m = matrix.length;int n = matrix[0].length;// 使用 HashSet 來存儲需要置零的行和列的索引,可以自動去重。Set<Integer> row = new HashSet<>();Set<Integer> col = new HashSet<>();// 步驟 1: 遍歷整個矩陣,記錄所有 0 元素所在的行和列索引for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (matrix[i][j] == 0) {// 將行號和列號添加到集合中row.add(i);col.add(j);}}}// 步驟 2: 再次遍歷矩陣,根據集合中的標記進行置零for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 如果當前元素的行號或列號在我們的標記集合中,// 那么這個元素就需要被置為 0。if (row.contains(i) || col.contains(j)) {matrix[i][j] = 0;}}}}
}

時空復雜度

時間復雜度:O(M * N)

  1. 標記階段:第一個雙層 for 循環遍歷了矩陣中的每一個元素一次。操作次數為 M * NHashSetadd 操作平均時間復雜度為 O(1)。因此,這部分的總時間復雜度是 O(M * N)
  2. 置零階段:第二個雙層 for 循環也遍歷了矩陣中的每一個元素一次。操作次數為 M * N
    • 在循環內部,row.contains(i)col.contains(j) 是關鍵操作。由于它們是 HashSet 的操作,其平均時間復雜度為 O(1)
    • 因此,這部分的總時間復雜度也是 O(M * N)

綜合分析
算法的總時間復雜度由兩個獨立的、對矩陣的完整遍歷組成。因此,最終的時間復雜度是 O(M * N) + O(M * N) = O(M * N)

空間復雜度:O(M + N)
  1. 主要存儲開銷:算法創建了兩個 HashSetrowcol
  2. 空間大小
    • row 集合最多存儲 M 個不同的行號(如果每一行都有0)。
    • col 集合最多存儲 N 個不同的列號(如果每一列都有0)。
    • 因此,這兩個集合占用的總空間與 MN 的和成正比。

綜合分析
算法所需的額外輔助空間主要由 rowcol 兩個哈希集合決定。因此,其空間復雜度為 O(M + N)

【LeetCode 熱題 100】73. 矩陣置零——(解法二)空間復雜度 O(1)

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

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

相關文章

【深度學習新浪潮】國內零樣本抗體設計的科研進展如何?

什么是AI零樣本抗體設計? AI零樣本抗體設計(Zero-shot AI Antibody Design)是指不依賴任何已知抗體序列或結構數據,僅根據靶點抗原信息,通過人工智能直接生成具有高親和力、高特異性的全新抗體序列的技術。其核心在于突破傳統抗體研發的“數據依賴瓶頸”,實現真正的“從…

【論文閱讀】A Diffusion model for POI recommendation

論文出處&#xff1a;ACM Transactions on Information Systems (TOIS) SCI一區 CCF-A期刊 論文地址&#xff1a;[2304.07041] A Diffusion model for POI recommendation 論文代碼&#xff1a;Yifang-Qin/Diff-POI: The official PyTorch implementation of Diff-POI. 目…

Rust實現FasterR-CNN目標檢測全流程

使用 Rust 和 FasterR-CNN 進行目標檢測 FasterR-CNN 是目標檢測領域廣泛使用的深度學習模型。Rust 生態中可以通過 tch-rs(Torch 綁定)調用預訓練的 PyTorch 模型實現。以下為完整實現步驟: 環境準備 安裝 Rust 和必要的依賴: cargo add tch cargo add anyhow # 錯誤…

Github 2025-07-03Go開源項目日報Top10

根據Github Trendings的統計,今日(2025-07-03統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Go項目10JavaScript項目2Go編程語言:構建簡單、可靠和高效的軟件 創建周期:3474 天開發語言:Go協議類型:BSD 3-Clause “New” or “Revise…

XML Schema 安裝使用教程

一、XML Schema 簡介 XML Schema&#xff08;XSD&#xff0c;全稱 XML Schema Definition&#xff09;是用于定義 XML 文檔結構、數據類型和數據約束的標準方式。它比 DTD 更加強大&#xff0c;支持數據類型、默認值、命名空間等&#xff0c;是企業級 XML 應用推薦的驗證方式。…

【字節跳動】數據挖掘面試題0008:計算西瓜視頻內容好評率

文章大綱題目描述題目描述 西瓜視頻近期開展了”2020百大人氣創作者”優質內容扶持項目&#xff0c;鼓勵用戶產出優質的視頻內容。 現需要統計2020年11月01日至2020年11月30日期間創作的視頻中&#xff0c; “科技”大類下“數碼測評"子類的視頻好評率&#xff08;好評率好…

Linux 進程控制:全面深入剖析進程創建、終止、替換與等待

文章目錄引言一、進程創建&#xff1a;fork()系統調用的奧秘1.1 fork()的基本原理1.2 代碼示例與解讀1.3 寫時復制&#xff08;COW&#xff09;優化二、進程終止&#xff1a;exit()與_exit()的抉擇2.1 exit()和_exit()的區別2.2 代碼示例與分析三、進程替換&#xff1a;exec()函…

PJSIP 中的 TCP 傳輸配置指南

PJSIP 支持通過 TCP 傳輸 SIP 消息&#xff0c;相比 UDP 提供了更可靠的傳輸機制。以下是關于在 PJSIP 中使用 TCP 的詳細指南。1. 創建 TCP 傳輸基本 TCP 傳輸配置cpjsua_transport_config tcp_cfg; pjsua_transport_config_default(&tcp_cfg); tcp_cfg.port 5060; // SI…

小菜狗的云計算之旅,今天學習MySQL數據庫基礎知識及操作

目錄 一、概述 數據庫概念 數據庫的類型 關系型數據庫模型 關系數據庫相關概念 二、安裝 1、mariadb安裝 2、mysql安裝 3、啟動并開機自啟 4、本地連接&#xff08;本地登錄&#xff09; 三、mysql數據庫配置與命令 yum安裝后生成的目錄 mysql服務器的啟動腳本 數…

為什么是直接在**原型(prototype)上**添加函數

這是一個非常經典、核心的 JavaScript 面向對象編程問題&#xff1a;> 為什么是直接在**原型&#xff08;prototype&#xff09;上**添加函數&#xff0c;而不是在類/構造函數內部直接添加&#xff1f;你提到的代碼中&#xff1a;javascript function TopSearchComponent() …

深入理解 classnames:React 動態類名管理的最佳實踐

在現代前端開發中&#xff0c;我們經常需要根據組件的狀態、屬性或用戶交互來動態切換 CSS 類名。雖然 JavaScript 提供了多種方式來處理字符串拼接&#xff0c;但隨著應用復雜性的增加&#xff0c;傳統的類名管理方式很快就會變得混亂不堪。這時&#xff0c;classnames 庫就像…

C++系列(七):深度探索C++內存 --- 分區、堆棧、new/delete與高效編程實踐

引言 程序運行的本質是對數據的處理&#xff0c;而內存則是程序執行的核心舞臺。理解內存的物理與邏輯分區&#xff0c;是掌握程序底層行為、編寫高效可靠代碼的關鍵基石。內存并非混沌一片&#xff0c;而是被嚴格劃分為代碼區、全局區、棧區和堆區。每個區域擁有獨特的生命周…

微信小程序71~80

1.總結小程序生命周期 小程序冷啟動&#xff0c;鉤子函數執行的順序保留當前頁面&#xff0c;進入下一個頁面&#xff0c;鉤子函數執行的順序銷毀當前頁面&#xff0c;進入下一個頁面&#xff0c;鉤子函數執行的順序小程序熱啟動&#xff0c;鉤子函數執行的順序 2.使用Componen…

[Pytest][Part 3]檢測python package狀態

目錄 實現需求1&#xff1a; 檢查python package狀態——pkg_resource hook實現自動檢測包狀態 conftest.py hook鉤子函數 Part1: https://blog.csdn.net/x1987200567/article/details/144915315?spm1001.2014.3001.5501 從這里開始逐個實現Part1中的需求 實現需求1&a…

自定義時間范圍選擇組件使用教程(基于 Vue 3 + Element Plus)

&#x1f553; 自定義時間范圍選擇組件使用教程&#xff08;基于 Vue 3 Element Plus&#xff09;? 一個靈活實用的時間范圍選擇器&#xff0c;支持開始時間、結束時間、快捷時間選項、本地雙向綁定、插槽擴展等功能。–&#x1f4d8; 一、功能介紹 該組件基于 Element Plus …

YOLOv8 模型轉換 ONNX 后 C# 調用異常:一個參數引發的跨平臺適配難題

一、問題背景&#xff1a;從 Python 訓練到 C# 部署的跨平臺需求 作為一名 C# 開發者&#xff0c;我在完成 YOLOv8 模型訓練&#xff08;使用 Ultralytics 官方框架&#xff0c;訓練數據為自定義目標檢測數據集&#xff0c;輸入尺寸 640x640&#xff0c;訓練輪次 100 輪&#…

Apache Cloudberry 亮相 2025 IvorySQL 生態大會暨 PostgreSQL 高峰論壇

6 月 27 日至 28 日&#xff0c;IvorySQL 2025 生態大會暨 PostgreSQL 高峰論壇在泉城濟南順利召開。本屆大會由 IvorySQL 開源數據庫社區主辦、瀚高基礎軟件股份有限公司承辦&#xff0c;吸引了來自國內外的數據庫技術專家、開發者與開源愛好者齊聚一堂&#xff0c;聚焦數據庫…

CMake之CMakeLists.txt語法規則

本文主要參考正點原子的應用開發手冊&#xff0c;僅作為本人學習筆記使用。 目錄 cmake 的使用方法其實還是非常簡單的&#xff0c;重點在于編寫 CMakeLists.txt&#xff0c;CMakeLists.txt 的語法規則也簡單&#xff0c;并沒有 Makefile的語法規則那么復雜難以理解&#xff01…

Mysql專題復習

重點內容&#xff1a;1. Mysql架構&#xff1a;客戶端 Server層 存儲引擎2. 索引數據結構&#xff1a;B樹4. 索引優化&#xff1a;覆蓋索引、排序、JOIN、分頁&#xff1b; COUNT; 索引下推&#xff1b;單/雙路排序5. 數據庫事務&#xff1b; 鎖&#xff1b;隔離級別&#xff…

CLIP的tokenizer詳解

一、bytes_to_unicodedef bytes_to_unicode():"""Returns list of utf-8 byte and a corresponding list of unicode strings.The reversible bpe codes work on unicode strings.This means you need a large # of unicode characters in your vocab if you wa…