[leetcode] 361. Bomb Enemy 解题报告

本文介绍了LeetCode中的361题,即在一个二维网格中使用一枚炸弹消灭敌人的问题。文章指出,原解法虽然能通过测试,但不满足O(m*n)的时间复杂度要求。作者分享了正确解决方案,即利用已搜索信息避免重复搜索,对于每一行和每一列,从当前位置开始向右或向下搜索直至遇到墙,以此计算出最大可消灭的敌人数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:https://leetcode.com/problems/bomb-enemy/

Given a 2D grid, each cell is either a wall 'Y', an enemy 'X' or empty '0' (the number zero), return the maximum enemies you can kill using one bomb.
The bomb kills all the enemies in the same row and column from the planted point until it hits the wall since the wall is too strong to be destroyed.
Note that you can only put the bomb at an empty cell.

Example:

For the given grid

0 X 0 0
X 0 Y X
0 X 0 0

return 3. (Placing a bomb at (1,1) kills 3 enemies)

思路: 昨天(8-22)一个美国小哥同学面了这题, 要求在O(m*n)内时间解决, 所以我原来的方法虽然可以过的了测试数据, 其实是不符合要求的, 而且这篇文章的阅读量居然已经有一千多了, 我深感抱歉, 我也无法我的所有答案就是对的, 大家参考一下, 并且欢迎指正.

正确的做法是可以在O(m*n)内做到的, 比较naive的做法是每个空位都向前后左右搜索, 但是这样的搜索包含了大量的重复搜索, 所以如何利用已经搜索过的信息就是本题的考点了. 对于每一行来说, 我们可以在第0列或者当前位置前一列为墙的时候从第当前列开始往右搜索直到撞到墙. 对于每一列来说, 可以在第0行的时候或者在当前行前一行为墙的时候从当前行往下搜索, 直到碰到墙为止. 这样就可以一次计算出一行直到碰到墙之前有几个敌人, 一列在没有碰到墙之前有几个敌人. 直到当某个某位之前位置墙的时候才会重新计算. 

代码如下:

class Solution {
public:
    int maxKilledEnemies(vector<vector<char>>& grid) {
        if(grid.size()==0) return 0;
        int row = grid.size(), col = grid[0].size(), rowHits, colHits[col], ans =0;
        for(int i = 0; i < row; i++)
        {
            for(int j =0; j < col; j++)
            {
                if(!i || grid[i-1][j]=='W')
                {
                    colHits[j] = 0;
                    for(int k = i; k < row && grid[k][j]!='W'; k++)
                        colHits[j] += grid[k][j]=='E';
                }
                if(!j || grid[i][j-1]=='W')
                {
                    rowHits = 0;
                    for(int k = j; k < col && grid[i][k]!='W'; k++)
                        rowHits += grid[i][k] == 'E';
                }
                if(grid[i][j] == '0')
                    ans = max(ans, colHits[j] + rowHits);
            }
        }
        return ans;
    }
};

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值