553. 炸弹袭击
中文English
给定一个二维矩阵, 每一个格子可能是一堵墙 W
,或者 一个敌人 E
或者空 0
(数字 '0'), 返回你可以用一个炸弹杀死的最大敌人数. 炸弹会杀死所有在同一行和同一列没有墙阻隔的敌人。 由于墙比较坚固,所以墙不会被摧毁.
样例
样例1
输入:
grid =[
"0E00",
"E0WE",
"0E00"
]
输出: 3
解释:
把炸弹放在 (1,1) 能杀3个敌人
样例2
输入:
grid =[
"0E00",
"EEWE",
"0E00"
]
输出: 2
解释:
P把炸弹放在 (0,0) 或 (0,3) 或 (2,0) 或 (2,3) 能杀2个敌人
注意事项
你只能在空的地方放置炸弹.
输入测试数据 (每行一个参数)如何理解测试数据?
class Solution: """ @param grid: Given a 2D grid, each cell is either 'W', 'E' or '0' @return: an integer, the maximum enemies you can kill using one bomb """ ''' 大致思路: 1.给出一个方法,求出当前点可以袭击的人数 2.内外循环,初始化max_num = 0,如果current_num > max_num,则更新,最终返回即可 ''' def maxKilledEnemies(self, grid): if not grid:return 0 max_num = 0 l_x,l_y = len(grid[0]),len(grid) #循环 for x in range(l_y): for y in range(l_x): if grid[x][y] == '0': current_num = self.currentKilledEnmies(x,y,grid) if current_num > max_num: max_num = current_num return max_num def currentKilledEnmies(self,x,y,grid): #上下左右延伸,遇到墙则停止,遇到人则计数 current_num = 0 l_x = len(grid[0]) l_y = len(grid) a,b = x,y #左右延伸,左边走 j = 1 while y - j >= 0: if (grid[x][y - j] == 'E'): current_num += 1 if (grid[x][y - j] == 'W'): break j += 1 #右边走 j = 1 while y + j <= l_x - 1: if (grid[x][y + j] == 'E'): current_num += 1 if (grid[x][y + j] == 'W'): break j += 1 #上面走 i = 1 while x - i >= 0: if (grid[x - i][y] == 'E'): current_num += 1 if (grid[x - i][y] == 'W'): break i += 1 #下面走 i = 1 while x + i <= l_y - 1: if (grid[x + i][y] == 'E'): current_num += 1 if (grid[x + i][y] == 'W'): break i += 1 return current_num
注:lintcode未通过,你的代码运行时间超过了限制,检查你的时间复杂度。
优化:
class Solution: """ @param grid: Given a 2D grid, each cell is either 'W', 'E' or '0' @return: an integer, the maximum enemies you can kill using one bomb """ ''' 大致思路: 1.给出一个方法,求出当前点可以袭击的人数 2.内外循环,初始化max_num = 0,如果current_num > max_num,则更新,最终返回即可 ''' def maxKilledEnemies(self, grid): m, n = len(grid), 0 if m: n = len(grid[0]) result, rows = 0, 0 num_x = 0 cols = [0 for i in range(n)] for i in range(m): for j in range(n): #取出横向坐标当前位置开始,可能当前坐标是0或者上一个是墙壁,看右边最多是多少人(紧贴0,和左边墙壁看,所以不考虑左边的人) if j == 0 or grid[i][j-1] == 'W': num_x = 0 for k in range(j, n): if grid[i][k] == 'W': break if grid[i][k] == 'E': num_x += 1 #Y轴 if i == 0 or grid[i-1][j] == 'W': cols[j] = 0 for k in range(i, m): if grid[k][j] == 'W': break if grid[k][j] == 'E': #这样避免前面的被覆盖掉,[1,2...]前面大的不会被后面覆盖掉,一直到出现W墙壁的时候,才会覆盖前面的值 cols[j] += 1 if grid[i][j] == '0' and num_x + cols[j] > result: result = num_x + cols[j] return result