361. Bomb Enemy
最后更新
二刷
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的更多相关文章
- LeetCode 361. Bomb Enemy
原题链接在这里:https://leetcode.com/problems/bomb-enemy/description/ 题目: Given a 2D grid, each cell is eith ...
- [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 ...
- 【LeetCode】361. Bomb Enemy 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力搜索 日期 题目地址:https://leetco ...
- leetcode 361.Bomb Enemy(lintcode 553. Bomb Enemy)
dp 分别计算从左到右.从右到左.从上到下.从下到上4个方向可能的值,然后计算所有为‘0’的地方的4个方向的值的最大值 https://www.cnblogs.com/grandyang/p/5599 ...
- [LeetCode] Bomb Enemy 炸弹人
Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...
- Leetcode: Bomb Enemy
Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...
- Bomb Enemy -- LeetCode
Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...
- Bomb Enemy
Description Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number z ...
- Bomb Enemy 炸弹人
Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...
随机推荐
- IOS开发网络篇之──ASIHTTPRequest详解
目录 目录 发起一个同步请求 创建一个异步请求 队列请求 请求队列上下文 ASINetworkQueues, 它的delegate提供更为丰富的功能 取消异步请求 安全的内存回收建议 向服务器端上传数 ...
- VisualStudio2013内置SQLServer入门(二)--增删改查
前一篇 http://www.cnblogs.com/qixi233/p/4766451.html 这篇是sqlserver的操作 界面比较走心哈哈哈,将就着看,主要就是下面增删改查四个btn 对于s ...
- javascript——迭代方法
<script type="text/javascript"> //五个迭代方法 都接受两个参数:要在每一项上运行的函数 和 运行该函数的作用域(可选) //every ...
- git学习小结 (笔记)
Modesty helps one to go forward, whereas conceit makes one lag behind. "虚心使人进步,骄傲使人落后" 注:本 ...
- (转载)无缝滚动图片的js和jquery两种写法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Jsoup库 解析DOM文档
DOM文档包括 HTML, XML等等 下载: http://jsoup.org/download Jsoup 获取数据的方式 //html 文本, url, 本地html String html = ...
- Python开发【第一章】:Python简介和入门
Python简介 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为ABC 语言的一种继承. ...
- oracle常见为题汇总,以及一个简单数据连接操作工厂
本人软件环境:win8.1 64位操作系统,vs2013,安装好了与oracle数据库对应的客户端 连接oracle数据库.以及操作数据库 1.使用IIS建立网站,浏览网页时候,提示“ ...
- 使用ToUpperInvariant避免使用ToUpper
ToUpperInvariant使用不依赖于区域性进行转换,而ToUpper则使用了当前线程的CultureInfo,进行转换,所以性能会有所影响,以下为测试: [Test] public void ...
- 运行在TQ2440开发板上以及X86平台上的linux内核编译
一.运行在TQ2440开发板上的linux内核编译 1.获取源码并解压 直接使用天嵌移植好的“linux-2.6.30.4_20100531.tar.bz2”源码包. 解压(天嵌默认解压到/opt/E ...