553. 炸弹袭击

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

 

posted @ 2020-05-29 01:58  风不再来  阅读(121)  评论(0编辑  收藏  举报