题目

Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return the maximum enemies you can kill using one bomb.
The bomb kills all the enemies in the same row and column from the planted point until it hits the wall since the wall is too strong to be destroyed.
Note that you can only put the bomb at an empty cell.

Example:

For the given grid0 E 0 0
E 0 W E
0 E 0 0return 3. (Placing a bomb at (1,1) kills 3 enemies)

思路

据说这道题目必须写出时间复杂度是O(m*n)的算法才算过(m是grid的行个数,n是grid的列个数)。我开始想到的解法是比较原始的动态规划,即定义四个二维数组left,right,up,down,分别表示它的某一个方向可以炸死多少个敌人,例如left[i][j]就表示如果在位置(i, j)放置一颗炸弹,可以炸死的左侧的敌人个数;right,up和down的含义类似。计算这四个二维数组可以用动态规划,花费的时间复杂度是O(m*n)。最后再用一个两重循环确定max(left[i][j] + right[i][j] + up[i][j] + down[i][j])。然而这里的空间复杂度高达O(4*m*n),显得很笨拙。

在网上看到一个很巧妙的算法,可以将空间复杂度降低到O(n)(当然再较真的话还可以降低到O(min(m, n)))。具体做法是:用二重循环遍历grid的时候,如果发现该格子处于第一行或者该格子的上面一个格子是墙,那么就把从该位置到下方第一个墙(或者边界)之间的敌人数目统计出来并且记录下来;同理,如果发现该格子处于第一列或者该格子的左边一个格子是墙,那么就把从该位置到右方第一个墙(或者边界)之间的敌人数目统计出来并且记录下来。之后如果发现该位置是空位置,说明可以放炸弹,就更新最终结果。该方法的巧妙之处在于每个纵区间和每个横区间内的敌人个数只会被统计一次。因此虽然在代码中两重循环内部还有一重循环,但是由于有if条件语句的存在,实际上总的时间复杂度仍然是O(m*n)。

代码

class Solution {
public:int maxKilledEnemies(vector<vector<char>>& grid) {if(grid.size() == 0 || grid[0].size() == 0) {return 0;}int row = grid.size(), col = grid[0].size(), rowHits, colHits[col], ans = 0;  for(int i = 0; i < row; ++i) {  for(int j = 0; j < col; ++j) {  if(i == 0 || grid[i-1][j]=='W') {   // update colHits[j] only if the row starts from 0 or the up element is 'W'colHits[j] = 0;  for(int k = i; k < row && grid[k][j]!='W'; ++k) { colHits[j] += (grid[k][j] == 'E');  }}  if(j == 0 || grid[i][j-1] == 'W') { // update rowHits only if the col start from 0 or the left element is 'W'rowHits = 0;  for(int k = j; k < col && grid[i][k]!='W'; ++k) { rowHits += (grid[i][k] == 'E');  }}  if(grid[i][j] == '0') {ans = max(ans, colHits[j] + rowHits);  }}  }  return ans;}
};

[Leetcode] 361. Bomb Enemy 解题报告相关推荐

  1. LeetCode 361. Bomb Enemy

    原题链接在这里:https://leetcode.com/problems/bomb-enemy/description/ 题目: Given a 2D grid, each cell is eith ...

  2. [精品]CSAPP Bomb Lab 解题报告(七)——隐藏关卡

    接上篇[精品]CSAPP Bomb Lab 解题报告(六) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

  3. [精品]CSAPP Bomb Lab 解题报告(六)

    接上篇[精品]CSAPP Bomb Lab 解题报告(五) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

  4. [精品]CSAPP Bomb Lab 解题报告(五)

    接上篇[精品]CSAPP Bomb Lab 解题报告(四) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

  5. [精品]CSAPP Bomb Lab 解题报告(四)

    接上篇[精品]CSAPP Bomb Lab 解题报告(三) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

  6. [精品]CSAPP Bomb Lab 解题报告(三)

    接上篇[精品]CSAPP Bomb Lab 解题报告(二) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

  7. [精品]CSAPP Bomb Lab 解题报告(二)

    接上篇[精品]CSAPP Bomb Lab 解题报告(一) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

  8. 【LeetCode】3Sum Closest 解题报告

    [题目] Given an array S of n integers, find three integers in S such that the sum is closest to a give ...

  9. LeetCode Maximum Product Subarray 解题报告

    LeetCode 新题又更新了.求:最大子数组乘积. https://oj.leetcode.com/problems/maximum-product-subarray/ 题目分析:求一个数组,连续子 ...

最新文章

  1. # Ubuntu 配置自带vnc桌面共享
  2. 输入几个数字,用逗号隔开系列例题
  3. 调用webservice查询手机号码归属地信息
  4. itext java_iText - PDF类库 - 组件类库 - JAVA开源项目 - 开源吧
  5. 活动安排--贪心算法C语言实现
  6. fastexcel读取excel追加写入sheet页_Python写入和读取excel
  7. 七牛云存储,图片储存
  8. LaTeX报告用模板
  9. netty做一个posp的网络_Java网络通信基础系列-Netty实现HTTP服务
  10. 【日常】python脚本系列:拳皇13一键出招以及连段实现
  11. ctex打开文件乱码或打不开
  12. 小米r2d做nas_零基础也可以打造智能家居,利用群晖docker将小米全家桶接入ios Homekit...
  13. Vue3 京东到家项目实战第一篇(首页及登录功能开发) 进阶式掌握vue3完整知识体系
  14. sap入门--操作指南
  15. IAR Systems
  16. python实现商品管理系统_商品管理系统(示例代码)
  17. 贴片功率电感封装尺寸与性能
  18. 如何写出完美的复试简历?没有科研竞赛经历怎么办?老师喜欢什么样的学生?跨考生?//2021-2-5
  19. 持续盈利的乐享互动谋变:电商相关业务猛增,与巨头相比差距甚远
  20. Postgresql:杀进程

热门文章

  1. 朋友圈怎么设计测试用例,面试官听完都惊呆了
  2. 突破制程工艺:为什么说7nm是物理极限,美国的1nm是什么概念?
  3. 蓝桥试题 算法提高 珠心算测验 JAVA
  4. 《王道计算机考研》:计算机网络概念、组成、功能、分类
  5. shell企业面试题练习
  6. 【老生谈算法】matlab实现单相桥式全控整流电路仿真——全控整流
  7. 《我的第一本算法书》阅读笔记 1-6 哈希表原理图解
  8. 转发: 杜拉拉升职记--读后感 (作者:lucia )
  9. 618活动,淘宝/京东/拼多多/苏宁易购/百亿补贴秒杀抢购助手,分享源码,欢迎指教
  10. 声明变量储存个人信息