Swift 解法詳解 LeetCode 361:轟炸敵人,用動態規劃輕松拿下

在這里插入圖片描述
在這里插入圖片描述

文章目錄

    • 摘要
    • 描述
    • 題解答案
    • 題解代碼分析
      • 代碼解析
    • 示例測試及結果
    • 時間復雜度
    • 空間復雜度
    • 總結

摘要

“轟炸敵人”這道題名字聽起來就很帶感,它其實是一個二維網格搜索問題。我們要找到一個能放置炸彈的位置,讓炸掉的敵人最多。雖然題目看起來復雜,但只要把計算方式優化一下,就能高效解決。今天這篇文章會帶大家把題目拆開講透,寫出 Swift 可運行的解法,并結合實際場景,看看類似的思路怎么用在日常開發里。

描述

題目是這樣的:

  • 給定一個 m x n 的網格。

  • 每個格子可能是以下幾種情況:

    • 'W':墻,炸彈的威力不能穿過這里。
    • 'E':敵人,炸彈能炸到。
    • '0':空位,可以放炸彈。
  • 你的任務是找出一個位置放炸彈,能夠炸死的敵人最多,并返回這個最大值。

炸彈的規則很簡單:

  • 它的威力可以沿著上下左右四個方向延伸。
  • 但是,一旦遇到墻 'W' 就會停止。

舉個例子:

輸入:
grid = [["0","E","0","0"],["E","0","W","E"],["0","E","0","0"]
]輸出: 3

解釋:
最佳位置是 grid[1][1]。放在這里能炸到左邊和下邊的敵人,再加上上方的敵人,總共 3 個。

題解答案

很多人一開始會寫一個暴力解:

  • 遍歷每個 '0',然后上下左右掃描,看能炸多少敵人。
  • 這樣做的復雜度是 O(m * n * (m + n)),大輸入下會超時。

更聰明的做法是:

  • 動態規劃(DP)+ 預處理
  • 思路是提前算好每個方向上能炸多少敵人,存下來。這樣放炸彈時只需要常數時間就能得到答案。

題解代碼分析

下面是 Swift 的完整可運行代碼:

import Foundationclass Solution {func maxKilledEnemies(_ grid: [[Character]]) -> Int {guard !grid.isEmpty, !grid[0].isEmpty else { return 0 }let m = grid.count, n = grid[0].count// 用來存儲從四個方向能炸到的敵人數var rowHits = Array(repeating: 0, count: n)var result = 0for i in 0..<m {var colHits = 0for j in 0..<n {// 每次遇到行的開頭或者墻,重新計算這一行的敵人數if j == 0 || grid[i][j-1] == "W" {colHits = 0var k = jwhile k < n && grid[i][k] != "W" {if grid[i][k] == "E" {colHits += 1}k += 1}}// 每次遇到列的開頭或者墻,重新計算這一列的敵人數if i == 0 || grid[i-1][j] == "W" {rowHits[j] = 0var k = iwhile k < m && grid[k][j] != "W" {if grid[k][j] == "E" {rowHits[j] += 1}k += 1}}// 當前位置是空位,才有資格放炸彈if grid[i][j] == "0" {result = max(result, colHits + rowHits[j])}}}return result}
}// Demo 演示
let grid: [[Character]] = [["0","E","0","0"],["E","0","W","E"],["0","E","0","0"]
]let solution = Solution()
print("輸入:")
for row in grid {print(row)
}
print("輸出:", solution.maxKilledEnemies(grid))

代碼解析

  1. colHits:用來記錄當前行在連續區間內能炸到的敵人數。
  2. rowHits[j]:用來記錄當前列在連續區間內能炸到的敵人數。
  3. 每次遇到墻 W,重新計算后面的敵人數。
  4. 遍歷到空位 '0' 時,把行和列的敵人數加起來,就是當前位置能炸到的敵人數。

這樣,所有計算都在一次遍歷里完成,大大降低了復雜度。

示例測試及結果

運行上面的 Demo,會輸出:

輸入:
["0", "E", "0", "0"]
["E", "0", "W", "E"]
["0", "E", "0", "0"]
輸出: 3

說明我們選的位置 grid[1][1] 確實能炸到最多敵人。

你也可以自己嘗試不同的地圖,比如:

[["W","E","0","E"],["0","W","E","0"],["E","0","E","W"]]

代碼會很快算出最佳位置。

時間復雜度

  • 整個網格遍歷一遍,每個元素在行和列最多只會被計算一次。
  • 時間復雜度是 O(m * n)
  • 相比于暴力解法 O(m * n * (m + n)),優化非常明顯。

空間復雜度

  • 我們額外用了一個數組 rowHits 來保存列方向的結果。
  • 空間復雜度是 O(n)
  • 對于大矩陣來說,內存消耗完全可接受。

總結

這道題的精髓就在于:提前預處理 + 避免重復計算
一旦你意識到“每一行每一列之間被墻切割成獨立區間”,思路就會清晰很多。

在實際場景里,類似的優化思路也很常見:
比如在游戲開發里,你可能需要頻繁計算某個范圍內的攻擊目標。如果每次都全局掃描效率就很低,但只要用緩存和預處理,就能大幅度提升性能。

這就是為什么算法訓練題不僅僅是刷題,而是能幫我們建立一套“高效解決問題”的思維方式。

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

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

相關文章

如何高效推進將科技創新成果轉化為標準?

2024年10月26日&#xff0c;全國標準信息公共服務平臺正式發布了國家標準《科技成果評估規范》&#xff08;GB/T 44731-2024 &#xff09;&#xff0c;并從發布之日起正式實施。這一標準的正式推出&#xff0c;標志著政府在推進科技成果轉化、提升科技服務能力方面邁出了重要一…

CMake 快速開始

CMake 快速開始 CMake 安裝 編輯環境&#xff1a;VS Code 編譯環境&#xff1a;VS Code Remote SSH模式 Ubuntu 24.04 CMake 官?源代碼下載地址&#xff1a;https://cmake.org/download/ CMake 官?英? 檔地址&#xff1a;https://cmake.org/cmake/help/latest/index.html S…

STM32F1 EXTI介紹及應用

第三章 EXTI介紹及應用 1. EXTI介紹 EXTI&#xff08;External interrupt/event controller&#xff09;—外部中斷/事件控制器&#xff0c;管理了控制器的 20 個中斷/事件線。每個中斷/事件線都對應有一個邊沿檢測器&#xff0c;可以實現輸入信號的上升沿檢測和下降沿的檢測。…

Oracle SYS用戶無法登錄數據庫-ORA-12162

錯誤詳情 [Oracleorcl bin]$ ./sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Production on Mon Aug 18 08:12:04 2025 Copyright (c) 1982, 2013, Oracle. All rights reserved. ERROR: ORA-12162: TNS:net service name is incorrectly specifiedOS登錄解析 注意&…

【計算機視覺與深度學習實戰】06基于光流算法的實時運動檢測系統設計與實現——以蚊子軌跡追蹤為例(有完整代碼)

第一章 引言 計算機視覺作為人工智能領域的重要分支,近年來在目標檢測、運動分析、行為識別等方面取得了顯著進展。其中,運動檢測技術作為視頻分析的基礎技術之一,在安防監控、交通管理、體感交互、生物行為研究等領域發揮著越來越重要的作用。光流算法作為運動檢測的經典方…

國產CANFD芯片技術特性與應用前景綜述:以ASM1042系列為例

摘要本文綜述了國科安芯推出的國產CANFD芯片ASM1042系列的技術特性與應用前景。ASM1042系列作為一款高性能的CANFD收發器&#xff0c;支持5Mbps的高速通信和高達70V的總線耐壓&#xff0c;廣泛應用于汽車電子、工業控制和航空航天等領域。文中詳細分析了其高速率設計、高耐壓設…

偶現型Bug處理方法---用系統方法對抗隨機性

在軟件開發中&#xff0c;Bug是影響產品質量的核心問題&#xff0c;而偶現型Bug&#xff08;Intermittent Bug&#xff09;因其“時隱時現、難以復現”的特性&#xff0c;成為最頭疼的挑戰之一。這類Bug不像必現Bug那樣有穩定的觸發路徑&#xff0c;可能在特定環境、特定操作序…

一分鐘docker部署onlyoffice 在線預覽word pdf excel...

目錄 效果 1.執行命令 2.訪問 3.測試 3.1執行下面的命令 3.2測試效果 3.3預覽效果 3.4轉換 效果 1.執行命令 sudo docker run -i -t -d -p 80:80 onlyoffice/documentserver 稍等片刻 2.訪問 瀏覽器打開ip:80即可訪問 3.測試 3.1執行下面的命令 sudo docker exec 7…

ES_數據存儲知識

一、 _source 字段&#xff1a;數據的“真相之源” 1. 是什么&#xff1f; _source 是一個獨立的、特殊的元字段。它存儲了你在索引文檔時提交的原始JSONbody的完整內容。 2. 工作原理與用途 寫入&#xff1a;當你索引一個文檔 {"title": "My Book", "…

day37-Nginx優化

1.每日復盤與今日內容1.1復盤nginx四層轉發rewrite tag&#xff1a;last和breakredirect、permanent&#x1f35f;&#x1f35f;&#x1f35f;&#x1f35f;&#x1f35f;Nginx內置參數動靜分離&#x1f35f;&#x1f35f;&#x1f35f;&#x1f35f;&#x1f35f;1.2今日內容N…

Zynq開發實踐(fpga高頻使用的兩個場景)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】本身fpga是介于純軟件和asic之間的元器件。如果是純軟件&#xff0c;那我們要做的&#xff0c;就是純上層開發。只要相關驅動已經實現&#xff0c;那…

20250822在Ubuntu24.04.2下指定以太網卡的IP地址

20250822在Ubuntu24.04.2下指定以太網卡的IP地址 2025/8/22 20:28緣起&#xff1a;公司的服務器的IP地址老變&#xff01;&#xff0c;路由器經常被其他其它部門斷電重啟。 導致IP地址被DHCP服務器給更改了&#xff01; 直接固定IP地址了。 本來想通過VI命令編輯配置文件來指定…

【yocto】BitBake指令匯總解析

【點關注&#xff0c;不迷路 】BitBake 是一個功能強大且核心的元任務執行器&#xff0c;它是 OpenEmbedded 和 Yocto Project 的構建基石。簡單來說&#xff0c;它就像一個高度專業化的 make 工具&#xff0c;但它能解析復雜的元數據&#xff08;配方、配置、類&#xff09;&…

CSS @media 媒體查詢

media 媒體查詢是響應式設計的核心工具&#xff0c;允許根據設備特性&#xff08;如屏幕寬度、高度、方向等&#xff09;應用不同的 CSS 樣式。一、基本語法media media-type and (media-feature) {/* 目標樣式規則 */ }媒體類型&#xff08;可選&#xff09;&#xff1a;all&a…

Vue2.x核心技術與實戰(三)

目錄 四、Vue2.x:組件通信&進階用法 4.1 組件的三大組成部分(結構/樣式/邏輯) 4.1.0 組件的三大組成部分-注意點說明 4.1.1 組件的樣式沖突 scoped 4.1.2 data是一個函數 4.2 組件通信 4.2.1 什么是組件通信 4.2.2 不同的組件關系和組件通信方案分類 4.2.2 父傳子…

泵站遠程監控與自動化控制系統:智慧泵房設備的創新實踐

在智慧水務快速發展的背景下&#xff0c;泵站自動化控制系統與水泵遠程監控技術已成為提升供水效率、保障水質安全、降低運維成本的核心手段。通過物聯網、云計算、邊緣計算等技術的深度融合&#xff0c;智慧泵房設備實現了從“人工值守”到“無人化智能管理”的跨越式升級&…

校園作品互評管理移動端的設計與實現

摘 要 本文概述了一款運用 Spring Boot 框架精心打造的校園作品互評管理移動端的設 計與實現&#xff0c;其設計初衷在于激發校園內的創作活力&#xff0c;并優化學生間的互評流程&#xff0c;進一 步推動教育模式的創新。該系統深度融合了移動互聯網技術&#xff0c;借助小程序…

為什么需要關注Flink并行度?

當你的Flink作業運行時&#xff0c;是否遇到過資源利用率不足或任務堆積的情況&#xff1f;這很可能與并行度設置不當有關。作為流處理領域的"性能放大器"&#xff0c;合理配置并行度能帶來&#xff1a;提升吞吐量資源成本降低的黃金比例背壓問題的天然解決方案一、四…

電腦芯片大的32位與64位指的是什么

32 位與 64 位既不單純指數據線根數&#xff0c;也不單純指地址線根數&#xff0c;而是對CPU 核心架構位數的統稱&#xff0c;其核心關聯以下兩個關鍵硬件指標&#xff0c;需結合場景區分&#xff1a;核心關聯&#xff1a;CPU 通用寄存器位數這是 “32 位 / 64 位” 的核心定義…

第1.1節:圖靈測試與AI的誕生

&#x1f3c6;作者簡介&#xff0c;黑夜開發者&#xff0c;CSDN領軍人物&#xff0c;全棧領域優質創作者?&#xff0c;CSDN博客專家&#xff0c;阿里云社區專家博主&#xff0c;2023年6月CSDN上海賽道top4。 &#x1f3c6;數年電商行業從業經驗&#xff0c;歷任核心研發工程師…