83、岛屿的个数

本文详细解析了如何使用BFS、DFS及LRU算法计算二维网格中岛屿的数量,介绍了算法原理并提供了具体代码实现。

题目描述:
给定一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

示例 1:

输入:
11110
11010
11000
00000

输出: 1
示例 2:

输入:
11000
11000
00100
00011

输出: 3

使用bfs算法,当然也可以使用LRU

代码:

class Solution {
    public int numIslands(char[][] grid) {
    if(grid == null || grid.length == 0 || grid[0].length == 0){
			return 0;
		}
        int result = 0;
		int x[] = {0,0,1,-1};
		int y[] = {1,-1,0,0};
		for (int i = 0; i < grid.length; i++) {
			for (int j = 0; j < grid[i].length; j++) {
				if(grid[i][j] == '1'){
					System.out.println("ge");
					result ++;
					Queue<int[]> tem = new LinkedList<>();
					tem.offer(new int[]{i,j});
					while (!tem.isEmpty()) {
						int gets[] = tem.poll();
						int x1 = gets[0];
						int y1 = gets[1];
						for (int k = 0; k < 4; k++) {
							int temx = x[k] + x1;
							int temy = y[k] + y1;
							if(temx >= 0 && temx < grid.length && temy >= 0 && temy < grid[i].length){
								if(grid[temx][temy] == '1'){
									tem.offer(new int[]{temx,temy});
									grid[temx][temy] = '0';
								}
						}
						}
					}
				}		
			}
		}
		
		return result;
    }
}

dfs就是比bfs快

class Solution {
   public int numIslands(char[][] grid) {
		if(grid == null || grid.length == 0 || grid[0].length == 0){
			return 0;
		}
		
		
		int result = 0;
		
		int x[] = {0,0,1,-1};
		int y[] = {1,-1,0,0};
		for (int i = 0; i < grid.length; i++) {
			for (int j = 0; j < grid[i].length; j++) {
				if(grid[i][j] == '1'){
				
					result ++;
					dfs(grid, i, j);
				}
			}
		}
		
		return result;
        
    }
	public void dfs(char grid[][],int row,int col){
		if(row < 0 || row >= grid.length || col < 0 || col >= grid[0].length){
			return ;
		}
		
        if(grid[row][col] == '1'){
			grid[row][col] = '0';
			dfs(grid, row + 1, col);
			dfs(grid, row - 1, col);
			dfs(grid, row, col + 1);
			dfs(grid, row, col - 1);
		}
	}
}

LRU算法实现

class Solution {
 int result = 0;
	public int numIslands(char[][] grid) {
		if(grid == null || grid.length == 0 || grid[0].length == 0){
			return 0;
		}
		int x[] = {0,0,1,-1};
		int y[] = {1,-1,0,0};
		
		int m = grid.length;
		int n = grid[0].length;
		int root[] = new int[m * n];
//		初始化
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				if(grid[i][j] == '1'){
					result ++;
					root[i * n + j] = i * n + j;
				}
			}
		}
		System.out.println(result);
//		进行合并操作
		for (int i = 0; i < m; i++) {
			for (int j = 0; j < n; j++) {
				if(grid[i][j] == '1'){
				//	grid[i][j] = '0';
					for (int k = 0; k < 4; k++) {
						int x1 = x[k] + i;
						int y1 = y[k] + j;
						if(x1 >= 0 && x1 < m && y1 >= 0 && y1 < n && grid[x1][y1] == '1'){
			//				result --;
							Unio(root, i * n + j, x1 * n + y1);
						}
					}
				}
			}
		}
		
		
		
		
		return result;
        
    }
	public void Unio(int [] root,int date1,int date2){
		int x1 = find(root,date1);
		int x2 = find(root, date2);
		if(x1 != x2 ){
			result --;
		}
		root[x1] = x2;
	}
	public int find(int root[],int date){
		return root[date] == date ? date:find(root, root[date]);
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值