200. 岛屿数量
200. 岛屿数量 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
func numIslands(grid [][]byte) int {
m, n := len(grid), len(grid[0])
bfs := func(i, j int) {
// 从[i, j]位置开始扩散
q := [][]int{{i, j}}
for len(q) != 0 {
e := q[0]
q = q[1:]
x, y := e[0], e[1]
if x >= 0 && x < m && y >= 0 && y < n && grid[x][y] == '1' {
grid[x][y] = '0'
q = append(q, []int{x+1, y})
q = append(q, []int{x-1, y})
q = append(q, []int{x, y+1})
q = append(q, []int{x, y-1})
}
}
}
cnt := 0
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if grid[i][j] == '0' {
continue
}
bfs(i, j)
// 为什么找到了一块陆地就可以增加一个岛屿数呢,
// 是因为在bfs方法中会将跟这块陆地相连的其他陆地染色,不会再次重复计算
cnt++
}
}
return cnt
}
301. 删除无效的括号
301. 删除无效的括号 给你一个由若干括号和字母组成的字符串 s ,删除最小数量的无效括号,使得输入的字符串有效。
返回所有可能的结果。答案可以按 任意顺序 返回。
func removeInvalidParentheses(s string) []string {
ans := []string{}
if s == "" {
return ans
}
q := []string{}
visit := make(map[string]bool)
q = append(q, s)
// 广度搜索,从长字符串到短字符串搜索,由于求的是最小的更改,所以同一层上如果已经找到了合法字符串
// 则不需要往下执行
isFound := false
for len(q) != 0 {
ns := q[0]
q = q[1:]
if isValid(ns) {
ans = append(ans, ns)
isFound = true
}
if isFound {
continue
}
for i, c := range ns {
if c >= 'a' && c <= 'z' {
continue
}
// 删除第i个元素
nns := ns[:i] + ns[i+1:]
if !visit[nns] {
q = append(q, nns)
visit[nns] = true
}
}
}
return ans
}
func isValid(s string) bool {
lb := 0
for _, c := range s {
if c == '(' {
lb++
}
if c == ')' {
if lb == 0 {
return false
}
lb--
}
}
return lb == 0
}