島嶼周長問題的三種解法:直接計數法、數學計算法與深度優先搜索

問題描述

給定一個二維網格?grid,其中1表示陸地,0表示水域。網格中的格子水平和垂直方向相連(對角線不相連)。網格中恰好有一個島嶼(即一個或多個相連的陸地格子),需要計算這個島嶼的周長。

解法一:直接計數法(迭代法)

思路分析

這是最直觀的解法:遍歷網格中的每個格子,如果是陸地,初始周長為4。然后檢查其上下左右四個方向的相鄰格子:

  • 每有一個相鄰的陸地格子,周長減1

  • 邊界情況自動處理(邊界外的格子視為水域)

代碼實現

class Solution {
public:int islandPerimeter(vector<vector<int>>& grid) {int res = 0;int m = grid.size(), n = grid[0].size();for(int i = 0; i < m; i++) {for(int j = 0; j < n; j++) {int add = 4;    // 方格初始周長if(grid[i][j] == 1) {if(i - 1 >= 0 && grid[i - 1][j] == 1) add--; // 上if(i + 1 < m && grid[i + 1][j] == 1) add--;  // 下if(j - 1 >= 0 && grid[i][j - 1] == 1) add--; // 左if(j + 1 < n && grid[i][j + 1] == 1) add--;  // 右res += add;}}}return res;}
};

復雜度分析

  • 時間復雜度:O(mn),其中m和n分別是網格的行數和列數

  • 空間復雜度:O(1),僅使用常數級別的額外空間

解法二:數學計算法

思路分析

這種方法基于一個數學觀察:

  1. 每個陸地格子貢獻4條邊

  2. 每對相鄰的陸地格子共享一條邊,會使總周長減少2條邊

因此,島嶼周長 = 陸地格子數 × 4 - 相鄰邊數 × 2

代碼實現

class Solution {public int islandPerimeter(int[][] grid) {int landCount = 0; // 陸地格子數量int adjacentCount = 0; // 相鄰邊數量for (int r = 0; r < grid.length; r++) {for (int c = 0; c < grid[0].length; c++) {if (grid[r][c] == 1) {landCount++;// 只檢查右側和下側,避免重復計數if (c + 1 < grid[0].length && grid[r][c + 1] == 1) {adjacentCount++;}if (r + 1 < grid.length && grid[r + 1][c] == 1) {adjacentCount++;}}}}return landCount * 4 - adjacentCount * 2;}
}

復雜度分析

  • 時間復雜度:O(mn)

  • 空間復雜度:O(1)

解法三:深度優先搜索(DFS)

思路分析

使用深度優先搜索遍歷島嶼:

  1. 當從陸地移動到邊界或水域時,周長增加1

  2. 使用標記避免重復訪問(將訪問過的陸地標記為2)

  3. 遞歸探索四個方向(右、下、左、上)

代碼實現

class Solution {constexpr static int dx[4] = {0, 1, 0, -1}; // 右、下、左、上constexpr static int dy[4] = {1, 0, -1, 0};public:int dfs(int x, int y, vector<vector<int>> &grid, int n, int m) {// 遇到邊界或水域,貢獻1條邊if (x < 0 || x >= n || y < 0 || y >= m || grid[x][y] == 0) {return 1;}// 已訪問過的陸地,不貢獻邊if (grid[x][y] == 2) {return 0;}grid[x][y] = 2; // 標記為已訪問int res = 0;// 探索四個方向for (int i = 0; i < 4; ++i) {int tx = x + dx[i];int ty = y + dy[i];res += dfs(tx, ty, grid, n, m);}return res;}int islandPerimeter(vector<vector<int>> &grid) {int n = grid.size(), m = grid[0].size();int ans = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if (grid[i][j] == 1) {ans += dfs(i, j, grid, n, m);}}}return ans;}
};

復雜度分析

  • 時間復雜度:O(mn),每個格子最多訪問一次

  • 空間復雜度:O(mn),遞歸調用棧的深度在最壞情況下可能達到網格大小

總結與對比

方法優點缺點適用場景
直接計數法直觀易懂,實現簡單需要檢查四個方向小規模網格
數學計算法效率高,僅需遍歷一次需要理解數學原理所有規模網格
深度優先搜索符合島嶼遍歷的直覺,可擴展性強需要遞歸,可能棧溢出大規模連通島嶼或需要擴展功能

在實際應用中:

  1. 對于簡單場景,數學計算法通常是最優選擇,高效且簡潔

  2. 當需要擴展功能(如計算多個島嶼)時,DFS更具擴展性

  3. 直接計數法則提供了最直觀的實現參考

理解這三種解法的核心思想,能夠幫助我們在解決類似網格問題時靈活選擇最合適的策略。

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

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

相關文章

將包含父子關系的扁平列表 List<Demo> 轉換成樹形結構的 List<DemoVO>,每個節點包含自己的子節點列表

1.stream遞歸操作 private List<DemoVO> createtree(List<Demo> datas) {//得到父節點return datas.stream().filter(m -> TargetConstants.ROOT.equalsIgnoreCase(m.getParentId())).map(m -> {DemoVO vo new DemoVO();vo.setTaxonomyId(m.getPlatformTaxo…

【Jmeter】Jmeter 高并發性能壓力測試

目錄 一、下載 Jmeter 二、配置環境變量 三、設置中文語言 四、入門最簡單的高并發性能壓測流程 1. 添加線程組 2. 添加請求 3. 添加監聽器 3.1 添加聚合報告 3.2 添加結果樹 4. 啟動測試 2 種啟動方式&#xff1a; 查看結果樹&#xff1a; 聚合報告&#xff1a; 五…

芯片測試之VIL/VIH(輸入電平)Test全解析:從原理到實戰

大家好&#xff0c;我是硅言。在數字芯片的“溝通體系”中&#xff0c;??VIL&#xff08;輸入低電平&#xff09;??和??VIH&#xff08;輸入高電平&#xff09;??如同芯片的“聽覺閾值”&#xff0c;決定了它能否準確識別外部信號的邏輯狀態。本文將從原理剖析、測試方…

【WPF】MVVM的消息機制

在WVM&#xff08;Model-View-ViewModel&#xff09;架構中&#xff0c;消息機制主要用于實現ViewModel與View之間的通信&#xff0c;同時保持它們的分離。這對于維護代碼的清晰度和可測試性非常重要。在WPF&#xff08;Windows Presentation Foundation&#xff09;應用程序中…

以樓宇自控關鍵技術,夯實現代低碳建筑發展重要基礎

當“碳達峰、碳中和”成為全球發展共識&#xff0c;建筑行業作為能源消耗與碳排放的重要領域&#xff0c;正加速向低碳化轉型。在這場綠色變革中&#xff0c;樓宇自控技術憑借對建筑設備的智能管控與能源優化能力&#xff0c;成為現代低碳建筑建設的核心支撐。從數據采集到智能…

西電【信息與內容安全】課程期末復習筆記

西電【信息與內容安全】課程期末復習筆記 來自2022年春的古早遺留檔案&#xff0c;有人需要這個&#xff0c;我就再發一下吧。 ? 平時成績&#xff1a; 10%。線上&#xff1a; 10% &#xff08;線上學習內容&#xff0c; 共 100 分。&#xff09;實驗&#xff1a; 10% &#…

【論文閱讀筆記】ICLR 2025 | 解析Ref-Gaussian如何實現高質量可交互反射渲染

Reflective Gaussian Splatting Info 會議 【ICLR 2025】 作者 復旦大學&#xff0c;薩里大學&#xff1b;復旦張力教授團隊 Github地址 https://github.com/fudan-zvg/ref-gaussian.git Project地址 https://fudan-zvg.github.io/ref-gaussian/ Abstract 新視圖合成得益…

面向GPU、CPU及機器學習加速器的機器學習編譯器

機器學習編譯器概述 機器學習編譯器是一種專門針對機器學習工作負載設計的工具&#xff0c;旨在將高層模型描述&#xff08;如TensorFlow或PyTorch模型&#xff09;高效編譯為可在不同硬件&#xff08;如GPU、CPU或專用加速器&#xff09;上執行的底層代碼。其核心目標是優化計…

論文分類打榜賽Baseline(2):InternLM昇騰硬件微調實踐

本文來自社區投稿&#xff0c;作者丁一超 書生大模型實戰營第5期已正式啟動&#xff0c;本期實戰營新增「論文分類打榜賽」&#xff0c;以幫助學員更好地掌握大模型技能。 本文將手把手帶領大家如何基于昇騰微調 InternLM 模型&#xff0c;輕松上手論文自動分類任務。從環境配…

mac安裝mvnd結合idea

mac安裝mvnd結合idea hi&#xff0c;我是阿昌&#xff0c;今天記錄一下mac系統下如何安裝mvnd同時通過maven-helper插件配置mvnd命令&#xff0c;提升編譯速度&#xff1b; 0、前言 如果你正在開發一個由大量模塊組成的大型項目&#xff0c;Gradle可以讓大型項目構建的更快&…

擴展模塊--QWebEngine功能及架構解析

Qt WebEngine 模塊在 Qt 6.9 中提供了基于 Chromium 的網頁渲染引擎功能。 一、主要功能 核心功能 網頁渲染引擎 基于 Chromium 項目的最新穩定版本 支持現代 HTML5、CSS3 和 JavaScript 標準 主要組件 QWebEngineView - 用于顯示網頁內容的 widget QWebEnginePage - 表示…

Spring Boot Admin監控

1、概述 Spring Boot Admin 是一款用于監控 Spring Boot 應用程序的開源工具&#xff0c;可幫助開發者實時監控應用的運行狀態、性能指標、日志信息等。 2、核心功能 應用狀態監控 顯示應用是否在線、啟動時間、運行時長等基礎信息。監控 JVM 相關指標&#xff1a;內存使用情…

【QT】QTableView自定義樣式:僅顯示行間隔、隱藏列間隔、表頭樣式、表格樣式、單行選中等

目錄 0.背景 1.詳細代碼 0.背景 項目需要&#xff0c;我有一個自定義的類Steer_Electrode_Table&#xff0c;是一個QTableView&#xff1b; 記錄一下QTableView修改前后的樣式&#xff0c;僅供參考 看一下我修改前后的樣式對比 1.詳細代碼 void Steer_Electrode_Table::init…

mvnd-快速打包maven項目

mvnd 一、簡介一、定位與背景二、核心架構與加速原理三、使用注意事項 二、下載安裝三、idea集成mvnd插件四、打包測試時長 一、簡介 mvnd&#xff08;Maven Daemon&#xff09;是Apache Maven團隊推出的高性能構建工具&#xff0c;旨在解決傳統Maven構建速度慢的問題。它通過…

C++ 中的尾調用優化TCO:原理、實戰與匯編分析

C尾調用優化 什么是尾調用&#xff1f;描述無返回值函數最后調用函數也可能做尾調用優化 例子關鍵特征&#xff08;寫法&#xff09; 尾調用和尾遞歸的區別&#xff1f;為什么尾調用優化可以提高效率&#xff1f;通常的遞歸調用&#xff1a;尾調用優化&#xff1a;為什么棧幀復…

Java集合 - ArrayList底層源碼解析

下面開始對 Java 中 ArrayList 的深度源碼分析&#xff0c;基于 JDK 8 的實現&#xff08;后續版本略有差異&#xff0c;但核心邏輯一致&#xff09;。我們將從 類結構、擴容機制、核心方法實現、性能優化、線程安全問題 等角度進行詳細解析 一、類結構與核心字段 1. 類繼承關…

【Qt】Qt控件

文章目錄 Qt控件Layout Spacer垂直布局QVBoxLayout水平排列布局QHBoxLayout網格布局 QGridLayout表格布局 QFormLayout Button Contain命令按鈕Push Button工具按鈕Tool Button單選按鈕Radio Button復選框按鈕Check Box命令鏈接按鈕Command Link Button按鈕盒Button Box組合框G…

PHP基礎-運算符

PHP 的運算符是編程中非常基礎但又非常重要的一部分&#xff0c;掌握它們能讓你更靈活地處理各種邏輯、計算和流程控制。 算術運算符 用于基本數學運算&#xff1a; 運算符含義示例加法$a $b-減法$a - $b*乘法$a * $b/除法$a / $b%取模$a % $b 示例&#xff1a; <?ph…

AR珠寶佩戴與傳統的珠寶購物有哪些區別??

AR 珠寶佩戴與傳統的珠寶購物究竟存在著哪些顯著區別呢?在傳統的珠寶購物模式里&#xff0c;顧客往往需要花費時間和精力前往實體珠寶店。踏入店內&#xff0c;首先映入眼簾的便是那一排排的玻璃展柜&#xff0c;此時&#xff0c;銷售人員會熱情地走上前&#xff0c;小心翼翼地…

華為云CAE部署spring cloud服務

1 概述 華為云CAE&#xff08;Cloud Application Engine云應用引擎&#xff09;是一個面向WEB、微服務應用的Serverless托管服務&#xff0c;提供極速部署、極低成本、極簡運維的一站式應用托管方案。支持從源碼、軟件包、鏡像包快速發布應用&#xff0c;秒級彈性伸縮、按量付…