zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    工程事故与现实世界(续)
    工程事故与现实世界
    直觉与概率
    有一种冲动:世界那么大
    人生的意义
    这些年来什么才是最好的投资?
    时间太少,如何阅读?
    程序员的成长法则与进阶攻略
    秘密:从程序员到领导者的微妙之处
    为什么加入付费社群?
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/12985089.html
Copyright © 2011-2022 走看看