【刷题打卡】day7-BFS

从现在开始每天至少刷一道题。
题库:lintcode

有些题目链接打不开,需要权限,那大家就去九章算法参考答案里找找。

598. Zombie in Matrix

题目链接
难度:medium
算法:bfs
时间复杂度:O(nm), 遍历整个matrix,需要O(nm)
空间复杂度:O(nm),队列最大内存开销是当matrix所有元素初始值都是zombie。

解题思路
这道题我最开始的思路是

  1. 遍历matrix,将僵尸加到队列中
  2. 将队首出队,将队首附近的被感染的人入队
  3. 循环第2步直到队列为空。
  4. 遍历此时的matrix,确定是否还有人。
  5. 为了获得不同批次被感染的人,我用了双队列。一个队列存原来的僵尸,一个队列存新被感染的僵尸。

这个思路可以优化的地方有两个。



一个是第4步,不通过遍历确定是否matrix还有人,而是采用一个变量numpeople。当numpeople == 0时,则认为此时所有人都被感染了。
另一个可以优化的地方是第5步,双队列还是有点浪费内存。如何确定不同level的队列呢?在poll之前,确定当前level的队列大小,再poll。

解法

class Position {
   
    int x, y;
    
    public Position(int x, int y){
   
        this.x = x;
        this.y = y;
    }
}
    


public class Solution {
   
    /**
     * @param grid: a 2D integer grid
     * @return: an integer
     */

    
    public int[] dx = {
   -1, 1, 0, 0};
    public int[] dy = {
   0, 0, -1, 1};
    public int PEOPLE = 0;
    public int ZOMBIE = 1;
    public int WALL = 2;
    
    public int zombie(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值