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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;历任核心研发工程师…