LeetCode 0934. 最短的桥

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0934. 最短的桥相关的知识,希望对你有一定的参考价值。

【LetMeFly】934.最短的桥

力扣题目链接:https://leetcode.cn/problems/shortest-bridge/

在给定的二维二进制数组 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] == 0A[i][j] == 1

方法一:广搜

在熟练掌握了图的搜索后,这道题也不难,两次搜索就可以了。

第一次搜索的时候,我们从任意一个“1”开始,当四联通(上下左右)还是1时,继续搜索,直到把一个“岛”搜完。

这样,我们就得到了一个完整的“岛”

第二次搜索的时候,我们从第一次得到的“岛”开始,一圈一圈地往外拓展。每走一步,答案加一。直到遇到新的“岛”为止

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2),一共进行了两次搜索
  • 空间复杂度 O ( n 2 ) O(n^2) O(n2),空间复杂度主要来自队列

AC代码

C++

typedef pair<int, int> pii;
const static int directions[4][2] = -1, 0, 1, 0, 0, -1, 0, 1;
class Solution 
private:
    // vector<vector<int>> distance;
    int n;

    queue<pii> getIslandBy1Node(int x, int y, vector<vector<int>>& grid) 
        grid[x][y] = -1;
        queue<pii> q, ans;
        q.push(x, y);
        ans.push(x, y);
        while (q.size()) 
            pii thisNode = q.front();
            q.pop();
            for (int d = 0; d < 4; d++) 
                int tx = thisNode.first + directions[d][0];
                int ty = thisNode.second + directions[d][1];
                if (tx >= 0 && tx < n && ty >= 0 && ty < n) 
                    if (grid[tx][ty] == 1) 
                        grid[tx][ty] = -1;
                        q.push(tx, ty);
                        ans.push(tx, ty);
                    
                
            
        
        return ans;
    
public:
    int shortestBridge(vector<vector<int>>& grid) 
        n = grid.size();
        // distance = vector<vector<int>>(n, vector<int>(n));
        queue<pii> q;
        for (int i = 0; i < n; i++) 
            for (int j = 0; j < n; j++) 
                if (grid[i][j]) 
                    q = getIslandBy1Node(i, j, grid);
                    goto loop;
                
            
        
        loop:;
        int ans = 0;
        while (true) 
            for (int i = q.size(); i > 0; i--) 
                pii thisNode = q.front();
                q.pop();
                for (int d = 0; d < 4; d++) 
                    int tx = thisNode.first + directions[d][0];
                    int ty = thisNode.second + directions[d][1];
                    if (tx >= 0 && tx < n && ty >= 0 && ty < n) 
                        if (grid[tx][ty] == 1) 
                            return ans;
                        
                        if (grid[tx][ty] == 0) 
                            grid[tx][ty] = -1;
                            q.push(tx, ty);
                        
                    
                
            
            ans++;
        
        // return -1;  // FakeReturn
    
;

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/127509391

以上是关于LeetCode 0934. 最短的桥的主要内容,如果未能解决你的问题,请参考以下文章

力扣 每日一题 934. 最短的桥难度:中等,rating: 1825(dfs / bfs)

2021-07-28:最短的桥。在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。返回必须翻转的(

统计碱基数目GC含量read数最长的read最短的read及平均read长度

[LeetCode] 934. Shortest Bridge 最短的桥梁

leetcode.1574 删除最短的子数组使剩余数组有序 - 阿里笔试 双指针 二分

剑指 Offer II 065. 最短的单词编码