中国专业家居装修装饰时尚门户网站
首页 >> 国内财经

世界上最短的桥(leetcode934_go_最短的桥)

来源:峰值财经 发布时间:2023-04-25 浏览量:

题目

在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)

现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。

返回必须翻转的 0 的最小数目。(可以保证答案至少是 1 。)

示例 1:输入:A = [[0,1],[1,0]] 输出:1

示例 2:输入:A = [[0,1,0],[0,0,0],[0,0,1]] 输出:2

示例 3:输入:A = [[1,1,1,1,1],[1,0,0,0,1],[1,0,1,0,1],[1,0,0,0,1],[1,1,1,1,1]] 输出:1

提示:2 <= A.length == A[0].length <= 100

A[i][j] == 0 或 A[i][j] == 1

解题思路分析

1、深度优先搜索+广度优先搜索;时间复杂度O(n^2),空间复杂度O(n^2)

leetcode934_go_最短的桥

leetcode934_go_最短的桥

var dx = []int{0, 1, 0, -1}var dy = []int{1, 0, -1, 0}var queue [][2]intvar n intfunc shortestBridge(grid [][]int) int {   n = len(grid)   queue = make([][2]int, 0)   for i := 0; i < n; i++ {      for j := 0; j < n; j++ {         if grid[i][j] == 1 {            dfs(grid, i, j)  // 深度优先搜索找边界            return bfs(grid) // 广度优先搜索找距离         }      }   }   return 0}func dfs(grid [][]int, i, j int) {   if i < 0 || i >= n || j < 0 || j >= n {      return   }   if grid[i][j] == 0 {      queue = append(queue, [2]int{i, j}) // 加入边界   } else if grid[i][j] == 1 {      grid[i][j] = 2 // 标记为2      for k := 0; k < 4; k++ {         x, y := i+dx[k], j+dy[k]         dfs(grid, x, y)      }   }}func bfs(grid [][]int) int {   res := 0   for len(queue) > 0 {      res++      length := len(queue)      for i := 0; i < length; i++ {         a, b := queue[i][0], queue[i][1]         for j := 0; j < 4; j++ {            x, y := a+dx[j], b+dy[j]            if 0 <= x && x < n && 0 <= y && y < n {               if grid[x][y] == 2 {                  continue               }               if grid[x][y] == 1 {                  return res               }               queue = append(queue, [2]int{x, y})               grid[x][y] = 2            }         }      }      queue = queue[length:]   }   return res}

总结

Medium题目,先使用深度优先搜索找到边界的0,再使用广度优先搜索找到最短的路径

友情链接