力扣岛屿数量

岛屿数量

在这里插入图片描述

// 岛屿数量
package picture

// 岛屿数量-深度优先算法
func numIslands(grid [][]byte) int {

	res := 0
	if len(grid) == 0 {
		return 0
	}
	nr, nc := len(grid), len(grid[0])

	var dfs func(grid [][]byte, r, c int)
	dfs = func(grid [][]byte, r, c int) {
		nr := len(grid)
		nc := len(grid[0])

		if r < 0 || c < 0 || r >= nr || c >= nc || grid[r][c] == '0' {
			return
		}

		grid[r][c] = '0'
		dfs(grid, r-1, c)
		dfs(grid, r+1, c)
		dfs(grid, r, c-1)
		dfs(grid, r, c+1)
	}

	for r := 0; r < nr; r++ {
		for c := 0; c < nc; c++ {
			if grid[r][c] == '1' {
				res++
				dfs(grid, r, c)
			}
		}
	}

	return res
}

// 岛屿数量-深度优先算法
func numIslandsII(grid [][]byte) int {
	res := 0
	for i := 0; i < len(grid); i++ {
		for j := 0; j < len(grid[i]); j++ {
			if grid[i][j] == '1' {
				res++
				DFS(grid, i, j)
			}
		}
	}
	return res
}

func DFS(grid [][]byte, r, c int) {
	h, w := len(grid), len(grid[0])
	if r < 0 || r >= h || c < 0 || c >= w {
		return
	}
	if grid[r][c] == '0' {
		return
	}
	grid[r][c] = '0'
	DFS(grid, r-1, c)
	DFS(grid, r+1, c)
	DFS(grid, r, c-1)
	DFS(grid, r, c+1)
}

// 广度优先算法
type point struct {
	x, y int
}

func numIslandsIII(grid [][]byte) int {
	count := 0
	for i := 0; i < len(grid); i++ {
		for j := 0; j < len(grid[0]); j++ {
			if grid[i][j] == '1' {
				bfs(grid, i, j)
				count++
			}
		}
	}
	return count
}

func bfs(grid [][]byte, i, j int) {
	queue := make([]point, 0)
	queue = append(queue, point{i, j})
	for len(queue) > 0 {
		cur := queue[0]
		queue = queue[1:]
		i, j = cur.x, cur.y

		if i < 0 || j < 0 || i >= len(grid) || j >= len(grid[0]) || grid[i][j] == '0' {
			continue
		}
		grid[i][j] = '0'
		queue = append(queue, point{i + 1, j})
		queue = append(queue, point{i - 1, j})
		queue = append(queue, point{i, j + 1})
		queue = append(queue, point{i, j - 1})

		//if i >= 0 && i < len(grid) && j >= 0 && j < len(grid[0]) && grid[i][j] == '1' {
		//	grid[i][j] = '0'
		//	queue = append(queue, point{i + 1, j})
		//	queue = append(queue, point{i - 1, j})
		//	queue = append(queue, point{i, j + 1})
		//	queue = append(queue, point{i, j - 1})
		//}
	}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值