BFS处理图的连通性问题 200 Number of Islands

这道题非常简单,因为和上一个题的解法基本相同(286 Walls and gates),只需要稍微变动一下就可以了,大概思路就是遍历整个图找到值为1的陆地,然后从这个点出发做BFS,将走过的地方设置成2(其实可以直接写成0的,我也不知道我当时怎么想的),BFS后继续找下一个值为1的陆地,继续上述步骤。每次找到新的陆地时计数器加1,最后返回计数器的值即可。
需要注意的是这道题的输入值是char,不要当成int来处理。

import java.util.ArrayList;
import java.util.LinkedList;

class Solution {
	int num_islands = 0;
	private ArrayList  directions = new ArrayList();
	public int numIslands(char[][] grid) {
		directions.add(new int[] {0,1});
		directions.add(new int[] {0,-1});
		directions.add(new int[] {1,0});
		directions.add(new int[] {-1,0});

		for(int i = 0; i < grid.length; i++) {
			for(int j = 0; j < grid[i].length; j++) {
				//if find land, do BFS 
				if(grid[i][j]== '1') {
					num_islands++;
					LinkedList queue= new LinkedList();
					queue.offer(new int[] {i,j});
					grid[i][j] = '2';//mark the land as visited
					while(!queue.isEmpty()) {
						int[] node = queue.poll();
						for(int[] dir: directions) {
							int[] temp = {0,0};
							temp[0] = node[0] + dir[0];
							temp[1] = node[1] + dir[1];
							if(temp[0] < 0 || temp[0] >= grid.length || temp[1] < 0 || temp[1] >= grid[i].length 
									|| grid[temp[0]][temp[1]] == '0' || grid[temp[0]][temp[1]] == '2')
								continue;
							grid[temp[0]][temp[1]] = '2';
							queue.offer(new int[] {temp[0],temp[1]});
						}
					}				
				}
			}	   
		}
		return num_islands;
	}
}

这个算法跑的非常慢,只比3.9%的算法快,标准答案的算法是用DFS实现的,但是思路和我的算法是一样的,复杂度也是一样的(O(mn)),所以我也不是很清楚为什么会这么慢。。。可能频繁的出队列入队列操作比较费时间?

你可能感兴趣的:(算法)