关闭

LeetCode Number of Islands

标签: javaleetcodeBFSDFSFlood Fill
125人阅读 评论(0) 收藏 举报
分类:

Description:

Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

Example 1:

11110
11010
11000
00000

Answer: 1

Example 2:

11000
11000
00100
00011

Answer: 3

Solution:

很明显的BFS或者DFS,用flood fill搞定。

这里需要注意的是,新fill的点,在第一次遍历到的时候就改变颜色,grid[da][db] = '0';而不要再for k循环的外层改变,grid[a][b] = '0'; 按照前一种做法,能够避免很多重复的点入队,否则按照第二种会TLE。

import java.util.*;

public class Solution {
	int m, n;
	int dir[][] = new int[][] { { 1, 0 }, { 0, 1 }, { 0, -1 }, { -1, 0 } };

	public int numIslands(char[][] grid) {
		this.m = grid.length;
		if (m == 0)
			return 0;
		this.n = grid[0].length;

		LinkedList<Integer> mList = new LinkedList<Integer>();
		LinkedList<Integer> nList = new LinkedList<Integer>();

		int a, b, da, db;

		int count = 0;
		for (int i = 0; i < m; i++)
			for (int j = 0; j < n; j++) {
				if (grid[i][j] != '1')
					continue;
				mList.add(i);
				nList.add(j);
				grid[i][j] = '0';
				count++;
				while (!mList.isEmpty()) {
					a = mList.poll();
					b = nList.poll();

					for (int k = 0; k < 4; k++) {
						da = a + dir[k][0];
						db = b + dir[k][1];
						if (valid(grid, da, db)) {
							mList.add(da);
							nList.add(db);
							grid[da][db] = '0';
						}
					}
				}
			}

		return count;
	}

	boolean valid(char[][] grid, int a, int b) {
		if (a < 0 || a >= m)
			return false;
		if (b < 0 || b >= n)
			return false;
		if (grid[a][b] == '1')
			return true;
		return false;
	}

	public static void main(String[] args) {
		Solution s = new Solution();
		System.out.println(5 & 6 & 7);
	}
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:62560次
    • 积分:3261
    • 等级:
    • 排名:第10448名
    • 原创:288篇
    • 转载:0篇
    • 译文:0篇
    • 评论:4条
    最新评论