package LeetCode_934 import java.util.* /** * 934. Shortest Bridge * https://leetcode.com/problems/shortest-bridge/description/ * * In a given 2D binary array A, there are two islands. * (An island is a 4-directionally connected group of 1s not connected to any other 1s.) Now, we may change 0s to 1s so as to connect the two islands together to form 1 island. Return the smallest number of 0s that must be flipped. (It is guaranteed that the answer is at least 1.) Example 1: Input: A = [[0,1], [1,0]] Output: 1 Constraints: 2 <= A.length == A[0].length <= 100 A[i][j] == 0 or A[i][j] == 1 * */ class Solution { /** * solution: DFS+BFS; * Time complexity:O(mn), every neighbor access 4 times (constant time); Space complexity:O(mn) * 1.use DFS or BFS to find one island and color all the nodes as 2 * 2.use BFS to find the shortest path from any node with color 2 to any node with color 1 * */ fun shortestBridge(A: Array<IntArray>): Int { val x = A.size val y = A[0].size //pair to save x,y val queue = LinkedList<Pair<Int, Int>>() for (i in 0 until x) { for (j in 0 until y) { if (A[i][j] == 1) { //find out the starting point helper(A, i, j, queue) break } } //if find out the starting point, break it, avoid update all to 2 if (queue.size > 0) { break } } //2.bfs to expand all node val direction = intArrayOf(0, 1, 0, -1, 0) var step = 0 while (queue.isNotEmpty()) { val size = queue.size for (k in 0 until size) { val cur = queue.poll() for (d in 0 until 4) { /* * get the new direction like: * x,y+1 * x,y-1 * x-1,y * x+1,y * */ val x = cur.first + direction[d] val y = cur.second + direction[d + 1] if (x < 0 || y < 0 || x >= A.size || y >= A[0].size || A[x][y] == 2) { continue } if (A[x][y] == 1) { return step } if (A[x][y] == 0) { A[x][y] = 2 } queue.offer(Pair(x, y)) } } step++ } return -1 } private fun helper(A: Array<IntArray>, x: Int, y: Int, queue: LinkedList<Pair<Int, Int>>) { if (x < 0 || y < 0 || x >= A.size || y >= A[0].size || A[x][y] != 1) { return } A[x][y] = 2 queue.offer(Pair(x, y)) helper(A, x, y + 1, queue) helper(A, x, y - 1, queue) helper(A, x + 1, y, queue) helper(A, x - 1, y, queue) } }