【LeetCode 每日一題】1277. 統計全為 1 的正方形子矩陣

Problem: 1277. 統計全為 1 的正方形子矩陣

文章目錄

  • 整體思路
  • 完整代碼
  • 時空復雜度
    • 時間復雜度:O(m * n)
    • 空間復雜度:O(m * n)

整體思路

這段代碼旨在解決一個經典的二維矩陣問題:統計全為 1 的正方形子矩陣個數 (Count Square Submatrices with All Ones)。問題要求計算在一個由 0 和 1 組成的矩陣中,所有元素都為 1 的正方形子矩陣的總數量。

該算法采用了一種非常高效的 動態規劃 (Dynamic Programming) 方法。其核心思想是構建一個 DP 表,并利用子問題的解來推導當前問題的解。

  1. 狀態定義 (DP State)

    • 算法創建了一個 dp 數組,其大小比原矩陣 matrix 大一圈([m+1][n+1]),這種“填充”技巧可以簡化邊界條件的處理。
    • dp[i][j] 的核心含義是:matrix[i-1][j-1] 為右下角 的、全由 1 組成的最大正方形的 邊長
  2. 狀態轉移方程

    • 算法遍歷原矩陣 matrix 的每一個單元格 (i, j)
    • 只有當 matrix[i][j] 本身為 1 時,它才有可能成為某個正方形的右下角。
    • 如果 matrix[i][j] == 1,那么以它為右下角的最大正方形的邊長,取決于其 上方左方左上方 三個相鄰位置所能形成的最大正方形。
    • 具體來說,一個新的、更大的 k x k 正方形,必須依賴于它旁邊已經存在三個 (k-1) x (k-1) 的正方形。因此,新的邊長受限于這三者中的最小值。
    • 狀態轉移方程為:
      dp[i+1][j+1] = min(dp[i][j+1], dp[i+1][j], dp[i][j]) + 1
      (這里的 dp 索引都比 matrix 的索引大 1)。
  3. 核心計數邏輯

    • 這是該算法最巧妙的一點。dp[i+1][j+1] 的值,比如說 k,不僅代表以 matrix[i][j] 為右下角的最大正方形邊長是 k,它還隱含了以該點為右下角的、邊長為 k-1, k-2, …, 1 的正方形也必然存在。
    • 因此,dp[i+1][j+1] 的值 k,恰好等于matrix[i][j] 為右下角的所有正方形的總數
    • 所以,在計算出每個 dp[i+1][j+1] 的值之后,直接將其累加到最終結果 ans 中,就可以統計出矩陣中所有的正方形。
  4. 算法流程

    • 創建一個 dp 表。
    • 遍歷輸入矩陣 matrix
    • 如果 matrix[i][j] 是 1,則根據狀態轉移方程計算 dp[i+1][j+1] 的值。
    • 將計算出的 dp[i+1][j+1] 累加到 ans
    • 如果 matrix[i][j] 是 0,則 dp[i+1][j+1] 保持默認值 0,對 ans 沒有貢獻,這符合邏輯。
    • 遍歷結束后返回 ans

完整代碼

class Solution {/*** 統計一個二維矩陣中,所有元素都為 1 的正方形子矩陣的總數量。* @param matrix 一個由 0 和 1 組成的二維整數數組* @return 全為 1 的正方形子矩陣的總數*/public int countSquares(int[][] matrix) {int m = matrix.length;int n = matrix[0].length;// dp 表:dp[i][j] 表示以 matrix[i-1][j-1] 為右下角的最大正方形的邊長。// 使用 m+1 和 n+1 的大小是為了增加一圈“哨兵”0,簡化邊界條件的處理。int[][] dp = new int[m + 1][n + 1];// ans: 用于累計正方形的總數。int ans = 0;// 遍歷原始矩陣的每一個單元格for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {// 只有當當前單元格為 1 時,它才可能成為正方形的一部分if (matrix[i][j] == 1) {// 狀態轉移方程:// 以 (i, j) 為右下角的最大正方形的邊長,取決于其左、上、左上三個方向// 形成的最大正方形邊長中的最小值,然后再加上當前這個單元格(+1)。// dp[i+1][j+1] 對應 matrix[i][j]。dp[i + 1][j + 1] = Math.min(Math.min(dp[i][j + 1], dp[i + 1][j]), dp[i][j]) + 1;// 核心計數邏輯:// dp[i+1][j+1] 的值 k,代表以 (i, j) 為右下角的正方形有 k 個// (邊長分別為 1, 2, ..., k)。// 因此,直接將這個值累加到總數中。ans += dp[i + 1][j + 1];}}}// 返回最終統計的結果return ans;}
}

時空復雜度

時間復雜度:O(m * n)

  1. 循環:算法的核心是兩個嵌套的 for 循環,它們完整地遍歷了輸入矩陣 matrix 的每一個單元格。
    • 外層循環執行 m 次(m 是矩陣的行數)。
    • 內層循環執行 n 次(n 是矩陣的列數)。
  2. 循環內部操作
    • 在循環的每一次迭代中,執行的操作(if 判斷、Math.min、數組讀寫、加法)都是常數時間復雜度的,即 O(1)

綜合分析
算法的總時間復雜度是 m * n 次 O(1) 操作,因此最終的時間復雜度為 O(m * n)

空間復雜度:O(m * n)

  1. 主要存儲開銷:算法創建了一個名為 dp 的二維數組來存儲動態規劃的狀態。
  2. 空間大小dp 數組的維度是 (m + 1) x (n + 1)。其占用的空間與輸入矩陣的大小 m * n 成正比。
  3. 其他變量m, n, ans, i, j 等變量都只占用常數級別的空間。

綜合分析
算法所需的額外輔助空間主要由 dp 數組決定。因此,其空間復雜度為 O(m * n)

參考靈神

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

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

相關文章

【論文閱讀】MedResearcher-R1: 基于知識引導軌跡合成框架的專家級醫學深度研究員

論文鏈接&#xff1a;https://arxiv.org/pdf/2508.14880 【導讀】當通用大模型還在“背題庫”時&#xff0c;螞蟻集團聯合哈工大推出的 MedResearcher-R1 已把“臨床查房”搬進訓練場&#xff01;這篇 2025 年 9 月發布的論文&#xff0c;首次讓開源 32B 模型在醫學深度研究基準…

基于大語言模型的事件響應優化方案探索

程序員的技術管理推薦閱讀 當愿望遇上能力鴻溝&#xff1a;一位技術管理者眼中的團隊激勵思考 從“激勵”到“保健”&#xff1a;80后與90后程序員&#xff0c;到底想要什么&#xff1f; 從“激勵”到“保健”&#xff1a;80后與90后程序員&#xff0c;到底想要什么&#xff1f…

數字化浪潮下,傳統加工廠如何智能化轉型?

在制造業向高端化、服務化升級的今天&#xff0c;傳統加工廠正面臨前所未有的挑戰。訂單碎片化、人力成本攀升、設備OEE&#xff08;綜合效率&#xff09;長期低于50%、質量波動難以追溯……這些痛點不僅壓縮著企業利潤空間&#xff0c;更讓其在應對市場需求變化時顯得遲緩。當…

謂語動詞選擇指南

文章目錄謂語動詞的重要性謂語動詞類別一. 助動詞1. be&#xff08;am, is, are, was, were, been, being&#xff09;表示 存在、狀態、身份、特征。2. have&#xff08;have, has, had&#xff09;表示 擁有、經歷 或 完成時態的助動詞。3. do&#xff08;do, does, did&…

代碼隨想錄學習摘抄day7(二叉樹11-21)

一個樸實無華的目錄題型226.翻轉二叉樹思路&#xff1a;把每一個節點的左右孩子交換一下101. 對稱二叉樹思路&#xff1a;使用隊列來比較兩個樹&#xff08;根節點的左右子樹&#xff09;是否相互翻轉222.完全二叉樹的節點個數思路&#xff1a;本題直接就是求有多少個節點&…

Python+DRVT 從外部調用 Revit:批量創建樓板

今天繼續批量創建常用的基礎元素&#xff1a;樓板。這次以簡單的輪廓為矩形的樓板為例。讓我們來看一看如何讓Revit自動干活&#xff1a; from typing import List import math # drvt_pybind 支持多會話、多文檔&#xff0c;先從簡單的單會話、單文檔開始 # MyContext是在Pyt…

猿輔導數據分析面試題及參考答案

給定用戶成績表,編寫SQL查詢排名靠前的用戶(例如前10名),并說明rank()和dense_rank()的區別。 要查詢成績表中排名靠前的用戶(如前10名),需先明確排名依據(通常為成績降序),再通過排序和限制結果行數實現。假設用戶成績表名為user_scores,包含user_id(用戶ID)和s…

在樹莓派集群上部署 Distributed Llama (Qwen 3 14B) 詳細指南

項目地址&#xff1a;https://github.com/b4rtaz/distributed-llama 本文檔將指導您如何使用一個樹莓派5作為Root節點和三個樹莓派4作為Worker節點&#xff0c;共同搭建一個4節點的分布式LLM推理集群&#xff0c;并運行10.9GB的Qwen 3 14B模型。 中間要用到github和huggingface…

C++ 容器——unordered_xxx

自 C11 開始&#xff0c;STL 引入了基于 hash table 的 unordered_set、unordered_map 等容器&#xff0c;正如其名它們是無序容器。一定數量&#xff08;據說有測試數據是10000000&#xff09;元素時無序容器的性能要比對應的有序容器優。一、容器數據結構unordered_set、unor…

分布式常見面試題整理

一、分布式理論&#xff1a; CAP理論 分布式系統最多同時滿足一致性&#xff08;C&#xff09;、可用性&#xff08;A&#xff09;、分區容錯性&#xff08;P&#xff09;中的兩個&#xff0c;無法三者兼得。 BASE理論 對CAP中一致性和可用性的權衡&#xff0c;強調基本可用&a…

Python基礎入門常用198英語單詞詳解

最近&#xff0c;我總結了一份Python學習者入門常用單詞表&#xff0c;列出了Python學習中常見的198個高頻單詞&#xff0c;供初學者學習使用。 這些單詞都比較簡單&#xff0c;非常易于理解&#xff0c;在掌握好單詞的基礎上&#xff0c;再去學Python可以達到事半功倍的效果。…

EP-SPY 網路追蹤規避實驗:山脈通聯測試

EP-SPY V3.0 https://github.com/MartinxMax/ep-spy 基於 GI6E 編碼的無線電通信工具&#xff0c;用於保護您的隱私。 https://github.com/MartinxMax/gi6e 編寫了偽協議以防止內容被解密無法通過網絡追蹤&#xff0c;抵抗官方監控無線音頻廣播&#xff0c;用於隱蔽信息傳輸…

蘋果 FoundationModels 秘典俠客行:隱私為先的端側 AI 江湖

引子 話說俠客島之上&#xff0c;有一對年輕俠侶 ——「青鋒劍客」凌云與「素心仙子」蘇凝&#xff0c;二人自幼習武&#xff0c;尤擅拆解各路奇功秘籍。 近日聽聞蘋果谷&#xff08;Apple&#xff09;于 WWDC 2025 武林大會之上&#xff0c;亮出一門全新絕學「FoundationMod…

華為基于IPD的產品質量計劃模板

目錄 模板:產品質量計劃模板....................................... 1 1. 介紹...................................................................... 5 1.1. 范圍和目的.................................................... 5 1.2. 參考資料..…

事務管理的選擇:為何 @Transactional 并非萬能,TransactionTemplate 更值得信賴

在 Spring 生態的后端開發中&#xff0c;事務管理是保障數據一致性的核心環節。開發者常常會使用 Transactional 注解快速開啟事務&#xff0c;一行代碼似乎就能解決問題。但隨著業務復雜度提升&#xff0c;這種“簡單”的背后往往隱藏著難以察覺的隱患。本文將深入剖析 Spring…

CodePerfAI體驗:AI代碼性能分析工具如何高效排查性能瓶頸、優化SQL執行耗時?

前陣子幫同事排查用戶下單接口的性能問題時&#xff0c;我算是真切感受到 “找性能瓶頸比寫代碼還磨人”—— 接口偶爾會突然卡到 3 秒以上&#xff0c;查日志只看到 “SQL 執行耗時過長”&#xff0c;但具體是哪個查詢慢、為什么慢&#xff0c;翻了半天監控也沒頭緒&#xff0…

《sklearn機器學習——繪制分數以評估模型》驗證曲線、學習曲線

估計器的偏差、方差和噪聲 每一個估計器都有其優勢和劣勢。它的泛化誤差可以分解為偏差、方差和噪聲。估計器的偏差是不同訓練集的平均誤差。估計器的方差表示對不同訓練集&#xff0c;模型的敏感度。噪聲是數據的特質。 在下圖中&#xff0c;可以看見一個函數 f(x)cos?32πxf…

2025年AI PPT必修課-匯報中AI相關內容的“陷阱”與“亮點”

《2025年AI PPT必修課-匯報中AI相關內容的“陷阱”與“亮點”》 (適用于方案匯報、戰略PPT、標書/投資人演示)一、內容類坑&#xff08;戰略/趨勢層面&#xff09;? Pitfall (不要寫)? Correct Expression (推薦寫法)Why (原因)還在強調 Caffe / Theano / TF1.x / LSTM采用 P…

Java數據結構 - 順序表模擬實現與使用

目錄1.順序表的基本介紹2.順序表的模擬實現2.1 常見的功能2.2 基本框架2.3 方法的實現2.3.1 add方法2.3.2 size方法2.3.3 display方法2.3.4 add&#xff08;int pos&#xff0c;E data)方法2.3.5 remove方法2.3.6 get方法2.3.7 contain方法2.3.8 indexOf方法2.3.9 set方法2.3.1…

rust語言 (1.88) egui (0.32.1) 學習筆記(逐行注釋)(二十六)windows平臺運行時隱藏控制臺

1、主程序第一句添加&#xff1a; 必須放在所有代碼第一句 #![cfg_attr(windows, windows_subsystem "windows")]2、 編譯命令&#xff1a;cargo build --release3、 編譯完成后運行可執行文件&#xff1a; 項目目錄/target/release/項目名.exe