Leetcode 1504. 統計全 1 子矩形

1.題目基本信息

1.1.題目描述

給你一個 m x n 的二進制矩陣 mat ,請你返回有多少個 子矩形 的元素全部都是 1 。

1.2.題目地址

https://leetcode.cn/problems/count-submatrices-with-all-ones/description/

2.解題方法

2.1.解題思路

單調棧

時間復雜度:O(n)

2.2.解題步驟

第一步,構建rows矩陣,rows[i][j]表示從mat[i][j]開始向左連續為1的個數(包括本身)

第二步,遍歷每一列,列號記為j,再遍歷每列中的每行,行號即為i

2.1.構建每一列的維護變量。total維護以(i,j)為右下角的全為1的子矩陣個數(如果該列的rows[i][j]非嚴格遞增,則就等于前綴和);stack維護隨著rows[i][j]嚴格遞增的單調棧,存儲單元形式為(rows[i][j],height*=rows矩陣中(i,j)上面連續不小于rows[i][j]的個數+1)

2.2.遍歷每一列,更新total和stack,并將total更新到結果變量result中。total更新:如果rows[i][j]大于或等于單調棧棧頂的元素,則直接將rows[i][j]增加到total中,并入棧即可;如果小于,則將大的元素從棧中彈出,并從total中切除多余的子矩陣數(相當于切成一個非嚴格遞增的rows[i][j]序列)

3.解題代碼

Python代碼

class Solution:def numSubmat(self, mat: List[List[int]]) -> int:# 思路:單調棧m, n = len(mat), len(mat[0])# 第一步,構建rows矩陣,rows[i][j]表示從mat[i][j]開始向左連續為1的個數(包括本身)rows = [[0] * n for _ in range(m)]for i in range(m):for j in range(n):if mat[i][j] == 1:if j > 0:rows[i][j] = rows[i][j - 1] + 1else:rows[i][j] = 1# 第二步,遍歷每一列,列號記為j,再遍歷每列中的每行,行號即為iresult = 0for j in range(n):# 2.1.構建每一列的維護變量。total維護以(i,j)為右下角的全為1的子矩陣個數(如果該列的rows[i][j]非嚴格遞增,則就等于前綴和);stack維護隨著rows[i][j]嚴格遞增的單調棧,存儲單元形式為(rows[i][j],height*=rows矩陣中(i,j)上面連續不小于rows[i][j]的個數+1)total = 0stack = []# 2.2.遍歷每一列,更新total和stack,并將total更新到結果變量result中。total更新:如果rows[i][j]大于或等于單調棧棧頂的元素,則直接將rows[i][j]增加到total中,并入棧即可;如果小于,則將大的元素從棧中彈出,并從total中切除多余的子矩陣數(相當于切成一個非嚴格遞增的rows[i][j]序列)for i in range(m):height = 1while stack and stack[-1][0] >= rows[i][j]:preRow, preHeight = stack.pop()height += preHeighttotal -= (preRow - rows[i][j]) * preHeighttotal += rows[i][j]stack.append([rows[i][j], height])result += totalreturn result

4.執行結果

在這里插入圖片描述

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

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

相關文章

【Docker】運行錯誤提示 unknown shorthand flag: ‘d‘ in -d ----詳細解決方法

使用docker拉取Dify的時候遇到錯誤 錯誤提示 unknown shorthand flag: d in -dUsage: docker [OPTIONS] COMMAND [ARG...]錯誤原因解析 出現 unknown shorthand flag: d in -d 的根本原因是 Docker 命令格式與當前版本不兼容,具體分為以下兩種情況: 新…

華為OD機試真題——攀登者2(2025A卷:200分)Java/python/JavaScript/C++/C語言/GO六種最佳實現

2025 A卷 200分 題型 本文涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、測試用例以及綜合分析; 并提供Java、python、JavaScript、C、C語言、GO六種語言的最佳實現方式! 2025華為OD真題目錄全流程解析/備考攻略/經驗分享 華為OD機試真題《攀登者2…

qt硬件與軟件通信中 16進制與十進制轉化

1. 首先上代碼, 這是在qt語言上的操作 截取 01 03 0C 00 00 00 00 00 00 00 0C 00 0C 00 0C 93 70 這串16進制數值進行處理,截取這樣一段內容 00 0C 00 0C 00 0C 字節數組轉字符串。從bytearray數組轉換為string. QString CustomTcpSocket::recieveInfo() {QByteArr…

圖形變換算法

一、學習目的 (1)掌握多面體的存儲方法。 (2)掌握圖形的幾何變換及投影變換。 (3)掌握三維形體不同投影方法的投影圖的生成原理。 (4)掌握多面體投影圖繪制的編程方法。 二、學…

【JAVAFX】自定義FXML 文件存放的位置以及使用

情況 1:FXML 文件與調用類在同一個包中(推薦) 假設類 MainApp 的包是 com.example,且 FXML 文件放在 resources/com/example 下: 項目根目錄 ├── src │ └── sample │ └── Main.java ├── src/s…

Ubuntu20.04安裝企業微信

建議先去企業微信官網看一下有沒有linux版本,沒有的話在按如下方式安裝,不過現在是沒有的。 方案 1、使用docker容器 2、使用deepin-wine 3、使用星火應用商店 4. 使用星火包deepin-wine 5、使用ukylin-wine 本人對docker不太熟悉,現…

CSS appearance 屬性:掌握UI元素的原生外觀

在現代網頁設計中,為了達到一致的用戶體驗,我們有時需要讓HTML元素模仿操作系統的默認控件樣式。CSS中的appearance屬性提供了一種簡便的方式來控制這些元素是否以及如何顯示其默認外觀。本文將詳細介紹appearance屬性,并通過實際代碼示例來展…

十四、C++速通秘籍—函數式編程

目錄 上一章節: 一、引言 一、函數式編程基礎 三、Lambda 表達式 作用: Lambda 表達式捕獲值的方式: 注意: 四、函數對象 函數對象與普通函數對比: 五、函數適配器 1、適配普通函數 2、適配 Lambda 表達式 …

大模型Rag-指令調度

本文主要記錄根據用戶問題指令,基于大模型做Rag,匹配最相關描述集進行指令調度,可用于匹配后端接口以及展示答案及圖表等。 1.指令查詢處理邏輯 1.實現思路 指令識別:主要根據用戶的問題q計算與指令描述集is [i0, ... , im]和指…

音視頻學習 - ffmpeg 編譯與調試

編譯 環境 macOS Ventrua 13.4 ffmpeg 7.7.1 Visual Studio Code Version: 1.99.0 (Universal) 操作 FFmpeg 下載源碼 $ cd ffmpeg-x.y.z $ ./configure nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.If you think configure made a mistake…

golang-常見的語法錯誤

https://juejin.cn/post/6923477800041054221 看這篇文章 Golang 基礎面試高頻題詳細解析【第一版】來啦~ 大叔說碼 for-range的坑 func main() { slice : []int{0, 1, 2, 3} m : make(map[int]*int) for key, val : range slice {m[key] &val }for k, v : …

音視頻之H.265/HEVC預測編碼

H.265/HEVC系列文章: 1、音視頻之H.265/HEVC編碼框架及編碼視頻格式 2、音視頻之H.265碼流分析及解析 3、音視頻之H.265/HEVC預測編碼 預測編碼是視頻編碼中的核心技術之一。對于視頻信號來說,一幅圖像內鄰近像素之間有著較強的空間相關性,相鄰圖像之…

基于政務問答的dify接口請求測試

Dify 的智能體后端服務 API 為開發者提供便捷方式,能讓前端應用直接調用大語言模型能力。在請求時,需先前往應用左側導航的 “API Access” 部分,在此可查看文檔和管理訪問憑據。為保障安全,API 密鑰應通過后端調用,避…

VMware Workstation 保姆級 Linux(CentOS) 創建教程(附 iso)

文章目錄 一、下載二、創建 一、下載 CentOS-7.9-x86_64-DVD-2009.iso 二、創建 VMware Workstation 保姆級安裝教程(附安裝包) VMware Workstation 保姆級安裝教程(附安裝包) VMware Workstation 保姆級安裝教程(附安裝包)

擴增子分析|基于R語言microeco包進行微生物群落網絡分析(network網絡、Zi-Pi關鍵物種和subnet子網絡圖)

一、引言 microeco包是福建農林大學姚敏杰教授團隊開發的擴增子測序集成分析。該包綜合了擴增子測序下游分析的多種功能包括群落組成、多樣性、網絡分析、零模型等等。通過簡單的幾行代碼可實現復雜的分析。因此,microeco包發表以來被學界廣泛關注,截止2…

GO語言-數據類型

文章目錄 變量定義1. 整數類型2. 浮點類型3. 字符類型4. 布爾類型5. 字符串類型5.1 字符串的本質5.2 常用字符串處理函數(strings包)5.3 修改字符串的方式 6. 數據默認值7. 類型轉換 變量定義 代碼如下: package mainimport "fmt"var i1 1000 var i2 i…

線性代數 | 知識點整理 Ref 2

注:本文為 “線性代數 | 知識點整理” 相關文章合輯。 因 csdn 篇幅合并超限分篇連載,本篇為 Ref 2。 略作重排,未整理去重。 圖片清晰度限于引文原狀。 如有內容異常,請看原文。 【數學】線性代數知識點總結 阿巴 Jun 于 2024-…

JavaSE學習(前端初體驗)

文章目錄 前言一、準備環境二、創建站點(創建一個文件夾)三、將站點部署到編寫器中四、VScode實用小設置五、案例展示 前言 首先了解前端三件套:HTML、CSS、JS HTML:超文本標記語言、框架層、描述數據的; CSS&#xf…

java + spring boot + mybatis 通過時間段進行查詢

前端傳來的只有日期內容&#xff0c;如&#xff1a;2025-04-17 需要在日期內容的基礎上補充時間部分&#xff0c;代碼示例&#xff1a; /*** 日志查詢&#xff08;分頁查詢&#xff09;* param recordLogQueryDTO 查詢參數對象* return 日志列表*/Overridepublic PageBean<…

解決ubuntu自帶火狐瀏覽器無法播放視頻問題

TIPS:一般執行完1 就可以了 首先安裝必要的媒體編解碼器和插件&#xff1a; # 安裝常用媒體編解碼器和插件 sudo apt update sudo apt install -y ubuntu-restricted-extras# 安裝額外的編解碼器 sudo apt install -y ffmpeg# 安裝其他視頻相關包 sudo apt install -y libavc…