leetcode-934:最短的桥

简介: leetcode-934:最短的桥

题目

题目连接

在给定的二维二进制数组 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

解题

方法一:BFS

1.首先遍历,找到其中岛屿的一个点

2.将第一步中找到的那个岛屿全部标记成-1

3.从第一个岛屿出发,开始BFS(层序遍历),一但遇到1,就说明遇到第二个岛屿了

class Solution {
public:
    vector<vector<int>> dirs={{-1,0},{1,0},{0,1},{0,-1}};
    int shortestBridge(vector<vector<int>>& grid) {
        int m=grid.size();
        int n=grid[0].size();
        //找到其中一个岛屿的点
        pair<int,int> startPoint;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]==1){
                    startPoint={i,j};
                    goto OUT;
                }
            }
        }
        OUT:
        //BFS
        //将找到的其中一个岛屿全部标记成-1,并把它全部存入q2中
        queue<pair<int,int>> q1;//用于bfs
        queue<pair<int,int>> q2;//将节点存起来,用于之后的bfs初始值
        grid[startPoint.first][startPoint.second]=-1;
        q1.push(startPoint);
        while(!q1.empty()){
            auto [x,y]=q1.front();
            q2.push({x,y});
            q1.pop();
            for(vector<int>& dir:dirs){
                int nx=x+dir[0];
                int ny=y+dir[1];
                if(nx>=0&&nx<m&&ny>=0&&ny<n&&grid[nx][ny]==1){
                    q1.push({nx,ny});
                    grid[nx][ny]=-1;
                }
            }
        }
        //BFS
        //-1表示已经访问过的点,0表示还未访问过的点,1表示目的岛屿
        //找到值为1的点就说明找到了
        int count=0;
        while(!q2.empty()){
            int l=q2.size();
            for(int i=0;i<l;i++){
                auto [x,y]=q2.front();
                q2.pop();
                for(vector<int>& dir:dirs){
                    int nx=x+dir[0];
                    int ny=y+dir[1];
                    if(nx>=0&&nx<m&&ny>=0&&ny<n){
                        if(grid[nx][ny]==1) return count;
                        else if(grid[nx][ny]==0){
                            q2.push({nx,ny});
                            grid[nx][ny]=-1;
                        }
                    }
                }
            }
            count++;  
        }
        return -1;
    }
};
相关文章
|
SQL 数据可视化 关系型数据库
【大数据】可视化仪表板 - Superset的安装和使用
【大数据】可视化仪表板 - Superset的安装和使用
1907 0
|
Kubernetes Linux Docker
【kubernetes】修复 linux 服务器重启后,kubelet 启动失败的问题
【kubernetes】修复 linux 服务器重启后,kubelet 启动失败的问题
3323 1
|
运维 Ubuntu Docker
深入理解容器化技术:Docker的应用与实践
在这个数字化转型迅速推进的时代,容器化技术为软件开发和部署提供了新的路径。本文将深入探讨Docker技术的基本原理、应用场景以及实际操作,旨在帮助读者全面理解并掌握这一关键技术。
1083 2
|
10月前
|
安全 Java API
告别SimpleDateFormat:Java 8日期时间API的最佳实践
在Java开发中,处理日期和时间是一个基本而重要的任务。传统的`SimpleDateFormat`类因其简单易用而被广泛采用,但它存在一些潜在的问题,尤其是在多线程环境下。本文将探讨`SimpleDateFormat`的局限性,并介绍Java 8引入的新的日期时间API,以及如何使用这些新工具来避免潜在的风险。
140 5
|
关系型数据库 MySQL Linux
一文教会你如何在Linux系统中使用Docker安装Mysql 5.7版本 【详细过程+图解】
这篇文章提供了在Linux系统中使用Docker安装Mysql 5.7版本的详细过程和图解,包括安装指定版本、创建实例、启动、使用Navicat连接测试、文件挂载与端口映射、进入容器、配置文件修改以及重新启动容器等步骤。
一文教会你如何在Linux系统中使用Docker安装Mysql 5.7版本 【详细过程+图解】
|
SQL Java
访问者模式问题之在上面的示例代码中,FunctionExtractor 类是怎么工作的
访问者模式问题之在上面的示例代码中,FunctionExtractor 类是怎么工作的
|
Kubernetes 网络协议 Cloud Native
Kubernetes网络问题排查分享两则(1)——calico特定场景下的网络性能问题
在对Kubernetes项目[kosmos](https://github.com/kosmos-io/kosmos)与Calico网络性能进行对比测试时,发现kosmos在跨集群容器网络的性能显著优于Calico的集群内网络(约6Gbit/s对比2.9Gbit/s)。物理机网络测试达到9.38Gbit/s,显示Calico有68%的性能损耗。问题定位到网卡的checksum/offload参数,尝试用`ethtool`调整后虽短暂提升,但随后恢复原状。转载自:https://mp.weixin.qq.com/s/XsQZCSqZAXJK46zqc7IpLw
【Python3 查询手册学习】,完整版PDF开放下载_python速查手册·模块卷(全彩版) pdf(1)
【Python3 查询手册学习】,完整版PDF开放下载_python速查手册·模块卷(全彩版) pdf(1)
|
JSON 安全 关系型数据库
SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
SpringCloud Gateway 实现自定义全局过滤器 + JWT权限验证
|
Rust 监控 安全
局域网远程桌面监控软件的性能优化技巧(Rust)
随着远程办公的兴起,局域网远程桌面监控软件的需求与日俱增。为了提高软件的性能和用户体验,我们可以利用Rust语言的特性进行优化。本文将介绍一些优化技巧,并提供一些代码示例,帮助开发者更好地优化远程桌面监控软件。
389 0