最后更新

二刷

11-Jan-2017

首先,正常做的话,是每个格子都纵向横向CHECK一下,这样复杂度爆炸。。

看起来是用dp[][]记录情况,避免重复计算。但是这样的话,得有2个dp[][],分别记录某一个格子可在横向和纵向分别干死多少敌人。 空间复杂度又爆炸。。O(2MN)

不过可以优化。

遍历的时候是从上往下,从左往右,所以对于grid[i][j]来说,假如他左边也是炸弹,那他横向能消灭多少敌人 和 左边格子横向消灭敌人数量一致。

纵向看他上面是不是炸弹,是的话也和上面能消灭的纵向敌人的数量一致。

所以对于一个格子,如果他左面或者上面是炸弹,可以直接用上面的数据,否则就要重新计算需要的方向,最后2个方向加起来。

空间上,每一行用一个变量记录能干死多少人就行了,纵向得一维数组,记录上一行这个位置能干死几个。

叙述挺麻烦,看眼代码一目了然。

Time Complexity:

O(MN)? 不会做,每个格子遍历,但是貌似worst case不太肯定,WORSTCASE是2个方向都要测一下,这也就意味着下一行下一列的格子不需要这样做了。。所以= =不确定。

Space: O(N)

public class Solution {
public int maxKilledEnemies(char[][] grid) {
if (grid.length == 0) return 0; int rows = grid.length;
int cols = grid[0].length;
int rowKill = 0;
int[] colKill = new int[cols]; int res = 0; for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) { // horizontal
if (j == 0 || grid[i][j-1] == 'W') {
rowKill = 0;
for (int t = j; t < cols && grid[i][t] != 'W'; t++) {
if (grid[i][t] == 'E') rowKill ++;
}
} // vertical
if (i == 0 || grid[i-1][j] == 'W') {
colKill[j] = 0;
for (int t = i; t < rows && grid[t][j] != 'W'; t++) {
if (grid[t][j] == 'E') colKill[j] ++;
}
} int tempTotal = rowKill + colKill[j];
if (grid[i][j] == '0') {
res = Math.max(res, tempTotal);
}
}
} return res;
}
}

一刷

14-Oct-2016

这个题确实不会。。只能想到naive的做法,不过那样应该是O(n³),不会满足要求。

看TAG是DP,那应该是建立DP[][]记录每点可炸的情况。一个点如果左边/上边是墙,或者左边/上边是边界,就要重新计算,否则跟左边/上边的那个格子的情况一样。 是空位就来一发,然后取最大。

这样应该是mn的extra space,时间变成(常数,但是不知道是什么。。)*n²。

不是很确定,看了答案,发现很巧妙。。

因为遍历是在一行一行的基础上,每列每列,所以没必要MN的extra space,一个变量记录每行的情况,过了那一行就自动更新,另一个int[cols]记录每列的情况就行了。。

时间上还是常熟*(n²)

public class Solution
{
public int maxKilledEnemies(char[][] grid)
{
if(grid.length == 0) return 0; int res = 0;
int row = 0;
int[] col = new int[grid[0].length]; for(int i = 0; i < grid.length;i++)
{
for(int j = 0; j < grid[0].length;j++)
{
if(i == 0 || grid[i-1][j] == 'W')
{
col[j] = 0;
int t = i;
while(t < grid.length && grid[t][j] != 'W')
{
if(grid[t][j] == 'E') col[j]++;
t++;
}
} if(j == 0 || grid[i][j-1] == 'W')
{
row = 0;
int t = j;
while(t < grid[0].length && grid[i][t] != 'W')
{
if(grid[i][t] == 'E') row++;
t++;
}
} if(grid[i][j] == '0') res = Math.max(res,col[j]+row);
} } return res;
}
}

361. Bomb Enemy的更多相关文章

  1. LeetCode 361. Bomb Enemy

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

  2. [LeetCode] 361. Bomb Enemy 炸敌人

    Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...

  3. 【LeetCode】361. Bomb Enemy 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力搜索 日期 题目地址:https://leetco ...

  4. leetcode 361.Bomb Enemy(lintcode 553. Bomb Enemy)

    dp 分别计算从左到右.从右到左.从上到下.从下到上4个方向可能的值,然后计算所有为‘0’的地方的4个方向的值的最大值 https://www.cnblogs.com/grandyang/p/5599 ...

  5. [LeetCode] Bomb Enemy 炸弹人

    Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...

  6. Leetcode: Bomb Enemy

    Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...

  7. Bomb Enemy -- LeetCode

    Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...

  8. Bomb Enemy

    Description Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number z ...

  9. Bomb Enemy 炸弹人

    Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...

随机推荐

  1. jdk配置环境变量(windows)

    1.配置环境变量:右击"我的电脑"-->"高级"-->"环境变量"1)在系统变量里新建"JAVA_HOME" ...

  2. 『重构--改善既有代码的设计』读书笔记----Remove Middle Man

    如果你发现某个类做了过多的简单委托动作,你就可以考虑是否可以让客户直接去调用受托类.在Hide Delegate中,我们介绍了封装受托对象的好处,但好处归好处也存在代价,就是当你每次需要在受托对象中增 ...

  3. 基于jQuery 的图片瀑布流实现

    解题思路: 第1步  分析问题:我这边的处理方式是以列为单位.每次滚动条滚到底部,把需要加的新的内容放在高度最小的列.如下图所示 加载后的显示 如果在继续往下滚动.新图片就会在1下边显示,如此类推. ...

  4. 源码来袭!!!基于jquery的ajax分页插件(demo+源码)

    前几天打开自己的博客园主页,无意间发现自己的园龄竟然有4年之久了.可是看自己的博客列表却是空空如也,其实之前也有写过,但是一直没发布(然而好像并没有什么卵用).刚开始学习编程时就接触到博客园,且在博客 ...

  5. 在2015中使用V12版本的ReportView控件,会导致winform窗体不能正常打开

    在2015中使用V12版本的ReportView控件,会导致winform窗体不能正常打开,使用V10版本没问题,但2015中默认使用的就是V12版本,所以需要避免使用V12版本

  6. 利用sfntly的sfnttool.jar提取中文字体

    雨忆博客中提到了sfntly(具体介绍可以看:https://code.google.com/p/sfntly/),利用其中sfnttool.jar就可以提取只包含指定字符的字体,如果想在页面中通过@ ...

  7. Dynamic Web Module 3.0 requires Java 1.6 or newer报错

    在项目的pom.xml的<build></build>标签中加入: <plugins> <plugin> <groupId>org.apac ...

  8. javascript获取div高度

    DOM的: 获得了div的高度值 = document.getElementById("目标id").offsetHeight;

  9. error_reporting()函数用法

    首先要知道error_reporting()函数是用来设置错误级别并返回当前级别的.它有14个错误级别,如下: 1        E_ERROR          致命的运行时错误. 错误无法恢复过来 ...

  10. 解读为什么有符号的char可表示范围是-128~+127

    问:为什么有符号的char可表示范围是-128~+127? 要明白这个问题,首先要明白一下几点: 对于char和int计算机中以补码形式存在. 严格来说计算机就是傻逼,它只知道某个位上是0还是1. 我 ...