方法:多源bfs
先遍历矩阵,找到第一个位置为1的点,对其进行bfs,把他所属的连通块的边界1都装入队列中。随后对队列中的元素进行bfs,首先遇到其他联通块的1即表示最短的桥的距离,返回答案即可。
class Solution {
public:
int n,m;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
queue<pair<int,int>> q;
void bfs(int i,int j,vector<vector<int>>& grid){
queue<pair<int,int>> nq;
nq.push({i,j});
grid[i][j]=-1;
while(!nq.empty()){
auto [x,y]=nq.front();
nq.pop();
int cnt=0;
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx<0||xx>=n||yy<0||yy>=n||grid[xx][yy]==0){
cnt++;
continue;
}
if(grid[xx][yy]==1){
nq.push({xx,yy});
grid[xx][yy]=-1;
}
}
if(cnt) q.push({x,y});
}
}
int shortestBridge(vector<vector<int>>& grid) {
n=grid.size(),m=grid[0].size();
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(grid[i][j]){
bfs(i,j,grid);
break;
}
}
if(!q.empty()) break;
}
int ans=0;
while(!q.empty()){
int sz=q.size();
while(sz--){
auto [x,y]=q.front();
q.pop();
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx<0||xx>=n||yy<0||yy>=n||grid[xx][yy]==-1) continue;
else if(grid[xx][yy]==0){
q.push({xx,yy});
grid[xx][yy]=-1;
}
else return ans;
}
}
ans++;
}
return ans;
}
};
时间复杂度:O(n*m)。
空间复杂度:O(n*m),n和m分别为矩阵的长和宽。