leetcode_73 矩陣置零

1. 題意

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

2. 題解

想不到O(1)的空間復雜度的做法,

只有抄抄題解這樣子才能維持的了生活。

2.1 暴力

維護兩個標記數組,分別表示某行或者某列有0。

時間復雜度O(n)O(n)O(n)

空間復雜度O(n)O(n)O(n)

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {// row column flagint r = matrix.size();int c = 0;if ( r )c = matrix[0].size();vector<int> row_flags(r, 0);vector<int> col_flags(c, 0);for (int i = 0;i < r; ++i) {for (int j = 0;j < c; ++j) {if (0 == matrix[i][j]) {row_flags[i] = col_flags[j] = 1;}}}for (int i = 0;i < r; ++i) {for (int j = 0; j < c; ++j) {if (row_flags[i] || col_flags[j])matrix[i][j] = 0;}}}
};
2.2 原地算法

用數組的第一行和第一列分別來表示,某一列或者某一行它有0。

我們用0來表示有0,因為這樣就不用考慮第0行和第0列的情況了。

在用0行和第0列表示之前, 我們需要用兩個變量先預處理出第0行

和第0列的情況。

在這里插入圖片描述
其實就是

nums[i][0]表示第i行有沒有0;

nums[0][j]表示第j列有沒有0;

其中0<i<rows,0<j<cols

而第0行和第0列就用first_col first_rol單獨進行判斷了。

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {// row column flagint r = matrix.size();int c = 0;if ( 0 != r)c = matrix[0].size();int first_col = 0;int first_row = 0;for (int i = 0;i < c; ++i) {if ( matrix[0][i] == 0) {first_row = 1;break;}}for (int i = 0; i < r; ++i) {if ( matrix[i][0] == 0) {first_col = 1;break;}}for (int i = 1; i < r; ++i) {for (int j = 1; j < c; ++j) {if ( matrix[i][j] == 0) {matrix[0][j] = 0;matrix[i][0] = 0;}   }}for (int i = 1; i < r; ++i) {for (int j = 1; j < c; ++j) {if (matrix[0][j] == 0 || matrix[i][0] == 0)matrix[i][j] = 0;}}if (first_col) {for (int i = 0;i < r; ++i)matrix[i][0] = 0;}if (first_row) {for (int i = 0;i < c; ++i)matrix[0][i] = 0;}}
};

而題解中維護一個變量的做法,

其實就是把nums[0][0]這個位置再拿去

表示第0行有0或者第0列有0從而省略掉一個變量。

但這樣做其實增加了復雜度,以nums[0][0]表示第0列有無0來說。

在這里插入圖片描述
對于nums[0][j]=0 , j>0來說,它不能引起nums[0][0]的更新,

因為nums[0][0]表示的是第0列的狀況,而不是第0行的狀況了。

因此需要加一個判斷了。

其次在最后遍歷數組的時候,我們需要逆序的列遍歷了。

因為如果順序的話nums[i][0]表示的行信息就被覆蓋掉了。

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {// row column flagint r = matrix.size();int c = 0;if ( 0 != r)c = matrix[0].size();int first_row = 0;for (int i = 0;i < c; ++i) {if ( matrix[0][i] == 0) {first_row = 1;break;}}for (int i = 0; i < r; ++i) {for (int j = 0; j < c; ++j) {if ( matrix[i][j] == 0) {matrix[0][j] = 0;if ( i != 0 )matrix[i][0] = 0;}   }}for (int i = 1; i < r; ++i) {// be carefull here, we need traversal reverse orderfor (int j = c - 1; ~j; --j) {if (matrix[0][j] == 0 || matrix[i][0] == 0)matrix[i][j] = 0;}}if (first_row) {for (int i = 0;i < c; ++i)matrix[0][i] = 0;}}
};

如果用nums[0][0]表示第0行的狀況也是相似的,代碼也給出來吧。

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {// row column flagint r = matrix.size();int c = 0;if ( 0 != r)c = matrix[0].size();int first_col = 0;for (int i = 0;i < r; ++i) {if ( matrix[i][0] == 0) {first_col = 1;break;}}for (int i = 0; i < r; ++i) {for (int j = 0; j < c; ++j) {if ( matrix[i][j] == 0) {matrix[i][0] = 0;if (j != 0)matrix[0][j] = 0;}   }}for (int i = r - 1; ~i; --i) {for (int j = 1;j < c; ++j) {if ( matrix[0][j] == 0 || matrix[i][0] == 0 ) {matrix[i][j] = 0;}}}if (first_col) {for (int i = 0;i < r; ++i)matrix[i][0] = 0;}}
};

空間復雜度O(1)O(1)O(1)

3. 參考

leetcode

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

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

相關文章

優雅地實現ChatGPT式的打字機效果:Spring Boot 流式響應

01 引言 之前專門介紹過流式響應的數據的接收、發送以及使用SSE由服務端推送數據的文章&#xff0c;但是要求前端必須使用EventSource訂閱實現。 有沒有通過直接通過瀏覽器訪問或者Fetch API直接調用的方式呢&#xff1f;效果還能和ChatGPT一樣&#xff0c;實現打字機的效果呢&…

Git 刪除文件

在 Git 中&#xff0c;刪除文件同樣被視為一種修改操作。下面我們通過實際操作演示如何刪除文件。假設要刪除文件 file5&#xff0c;如果你直接在文件系統中執行了刪除&#xff1a;這種直接刪除的方式并不會在 Git 中生效&#xff0c;反而會導致工作區與版本庫不一致。使用 git…

虛幻基礎:角色變換角色視角蒙太奇運動

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄角色視角機臂使用pawn控制旋轉&#xff1a;旋轉體將失去作用旋轉體攝像機&#xff1a;可以使用旋轉體控制&#xff1a;pawn不起作用角色變換角色移動&#xff1a;由移動組件控制移動方向&#xff1a;給組件任意一個方…

【LeetCode】31. 下一個排列

文章目錄31. 下一個排列題目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;解題思路1. 問題本質與字典序回顧2. 經典算法三步曲&#xff08;必須原地、常數空間&#xff09;3. 直觀示例與過程可視化4. 與“62. 不同路徑”風格對應的分析維度4.1 …

CVPR2025丨VL2Lite:如何將巨型VLM的“知識”精煉后灌入輕量網絡?這項蒸餾技術實現了任務專用的極致壓縮

關注gongzhonghao【CVPR頂會精選】小模型&#xff08;Small Models&#xff09;通常指參數量較小、計算與存儲成本更低的深度學習模型。近年來&#xff0c;它們在移動端部署、邊緣計算和隱私保護等場景中快速發展&#xff0c;逐漸成為大模型的輕量化補充。隨著蒸餾、剪枝、量化…

【SystemUI】鎖屏來通知默認亮屏Wake模式

一、問題描述 基于 Android 14平臺&#xff0c;鎖屏狀態下來通知時默認是進入Doze模式&#xff0c;此時屏幕不能點擊只能查看通知信息且很快滅屏&#xff0c;用戶體驗不是很好&#xff0c;要求修改為通知直接亮屏。二、問題分析 梳理鎖屏狀態下&#xff08;特指設備息屏或處于D…

高并發寫入、毫秒級查詢——盤古信息攜手 TDengine 時序數據庫解決六大技術挑戰

小T導讀&#xff1a;廣東盤古信息科技股份有限公司&#xff08;下文簡稱盤古信息&#xff09;成立于 2005 年&#xff0c;是一家基于工業互聯網平臺的數字化管理解決方案供應商&#xff0c;公司自主研發的 IMS&#xff08;數字化智能制造系統&#xff09;可為離散、流程及混合制…

Unity 打包 iOS,Xcode 構建并上傳 App Store

一、準備工作&#xff08;環境、賬號、證書與項目基礎&#xff09;系統與工具macOS&#xff1a;使用與最新 Xcode 兼容的版本。Xcode&#xff1a;從 Mac App Store 安裝最新穩定版&#xff08;建議與當前 App Store 必需的 Xcode 主版本保持一致&#xff09;。Unity&#xff1a…

Windows系統安裝stata軟件教程

1、解壓縮2、點擊next3、選擇第一個&#xff0c;然后next4、這里隨便填寫就行5、選擇stataMP&#xff0c;然后next6、這里改個路徑&#xff0c;例如D:\Program Files\Stata18\7、這里不用管&#xff0c;選擇next8、點擊install&#xff0c;開始安裝過程9、安裝過程展示。10、最…

Android 開發 - 數據共享(數據共享、內容提供者實現、動態權限申請)

一、數據共享 1、內容提供者 內容提供者 ContentProvider 為 APP 存取內部數據提供統一的外部接口&#xff0c;讓不同的應用之間得以共享數據2、流程理解 Client APP 將用戶的輸入內容通過 ContentProvider 跨進程通信傳遞給 Server APP3、數據訪問 利用 ContentProvider 只實現…

【51單片機按鍵按下數碼管秒增計時并LED亮釋放停計時LED熄】2022-11-12

緣由單片機控制數碼管及LED燈-嵌入式-CSDN問答 #include "REG52.h" sbit k1P3^0; unsigned char Js0;//計時 unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07 ,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64,15,56}; //共陰0~F消隱減號 void…

IBMS集成管理系統與3D數字孿生智能服務系統的應用

一九九二九九零七八八三一、數據全生命周期安全&#xff1a;從采集到銷毀的閉環防護整合系統的核心風險之一是數據泄露或篡改&#xff08;如設備控制參數、建筑安防布局、人員動線數據&#xff09;&#xff0c;需覆蓋數據流轉的每個環節&#xff1a;1. 數據采集階段&#xff1a…

Vue3組件加載順序

父組件&#xff1a;QualityFile.vue<script setup lang"ts" name"QualityFile"> ...... </script><template><el-container class"container"><el-header class"header"><!-- 標題 --><div cl…

GitHub 宕機自救指南:應急預案與替代平臺

GitHub 宕機自救指南:應急預案與替代平臺 對于全球數百萬開發者而言,GitHub 的穩定運行至關重要。然而,即便是最可靠的服務也可能出現意外中斷。當 GitHub 無法訪問時,代碼托管、協作開發、持續集成與部署(CI/CD)等關鍵環節都將受到影響。本指南旨在為您提供一套完整的應…

將跨平臺框架或游戲引擎開發的 macOS 應用上架 Mac App Store

隨著 macOS 用戶數量的增長&#xff0c;越來越多的開發者希望將自己的桌面應用或游戲上架到 Mac App Store&#xff0c;以便觸達更多用戶并獲得官方的分發優勢。但 Apple 的上架流程相比其他平臺要嚴格得多&#xff0c;涉及簽名、打包、沙盒、審核、公證等環節。本文將以博文的…

拷貝構造和賦值重載有什么區別

問題拷貝構造和賦值重載有什么區別我的回答拷貝構造函數和賦值運算符重載是C中兩個看似相似但用途和行為有明顯區別的特性。拷貝構造函數是用來創建一個新對象作為已存在對象的副本。它的形式是ClassName(const ClassName& other)&#xff0c;在以下情況會被調用&#xff1…

(筆記)輸入法框架協作機制深度分析

概述 Android輸入法框架&#xff08;IMF - Input Method Framework&#xff09;是Android系統中負責管理虛擬鍵盤和文本輸入的核心組件。該框架協調輸入法服務&#xff08;IME&#xff09;、應用程序和系統輸入系統之間的復雜交互&#xff0c;為用戶提供靈活高效的文本輸入體驗…

解開 Ansible 任務復用謎題:過濾器用法、Include/Import 本質差異與任務文件價值詳解

1. 什么是變量過濾器&#xff08;Variable Filters&#xff09;&#xff1f;請列舉幾個常用的Jinja2過濾器及其用途。變量過濾器是在Jinja2模板中用于修改或格式化變量輸出的工具。常用過濾器&#xff1a;to_json/to_yaml&#xff1a;將數據結構&#xff08;如字典、列表&#…

LangGraph-笑話評估器 應用實戰

場景&#xff1a;用戶指定冷笑話主題&#xff0c;生成冷笑話后&#xff0c;進行評估&#xff0c;如果不搞笑就需要重新生成以下代碼實現了一個基于LangGraph的冷笑話自動生成與評估工作流。系統包含兩個核心節點&#xff1a;生成器根據用戶主題創作冷笑話&#xff0c;評估器對笑…