从现在开始每天至少刷一道题。
题库:lintcode
有些题目链接打不开,需要权限,那大家就去九章算法参考答案里找找。
598. Zombie in Matrix
题目链接
难度:medium
算法:bfs
时间复杂度:O(nm), 遍历整个matrix,需要O(nm)
空间复杂度:O(nm),队列最大内存开销是当matrix所有元素初始值都是zombie。
解题思路
这道题我最开始的思路是
- 遍历matrix,将僵尸加到队列中
- 将队首出队,将队首附近的被感染的人入队
- 循环第2步直到队列为空。
- 遍历此时的matrix,确定是否还有人。
- 为了获得不同批次被感染的人,我用了双队列。一个队列存原来的僵尸,一个队列存新被感染的僵尸。
这个思路可以优化的地方有两个。
思
考
一
下
一个是第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(