首页 > 其他分享 >LeetCode 934.最短的桥

LeetCode 934.最短的桥

时间:2023-06-07 14:02:04浏览次数:35  
标签:qu int dfs 最短 vector grid size LeetCode 934


LeetCode 934.最短的桥

题目限制了岛的数量肯定为2,所以我们只需要找到两个岛即可,首先通过遍历每一个坐标找到一个岛的点(值为1),接着以这个点开始DFS,找到该岛上所有的点,并将值设为-1,然后以这些点为基础集合,再进行BFS,当找到第一个值为1的点时,BFS的层数就是需要翻转的数目

class Solution {
public:
    void dfs(int x,int y, vector<vector<int>>& grid, queue<pair<int, int>> &qu){
        if(x<0 || y<0 || x>=grid.size() || y>=grid[0].size() || grid[x][y]!=1)  return;
        qu.emplace(x, y);
        grid[x][y]=-1;
        dfs(x-1, y, grid, qu);
        dfs(x+1, y, grid, qu);
        dfs(x, y-1, grid, qu);
        dfs(x, y+1, grid, qu);
    }
    int shortestBridge(vector<vector<int>>& grid) {
        int n = grid.size();
        vector<vector<int>> dir={{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]==1)
                {
                    queue<pair<int, int>> qu;
                    dfs(i, j, grid, qu);
                    int step=0;
                    while(!qu.empty()){
                        int sz=qu.size();
                        for(int i=0;i<sz;i++)
                        {
                            auto [x, y] = qu.front();
                            qu.pop();
                            for(int k=0;k<4;k++)
                            {
                                int nx= x + dir[k][0];
                                int ny=y+dir[k][1];
                                if(nx>=0 && ny>=0 && nx<n && ny<n){
                                    if(grid[nx][ny]==0){
                                        qu.emplace(nx, ny);
                                        grid[nx][ny] = -1;
                                    }
                                    else if(grid[nx][ny]==1){
                                        return step;
                                    }
                                }
                            }
                        }
                        step++;
                    }
                }
            }
        }
        return 0;
    }
};


标签:qu,int,dfs,最短,vector,grid,size,LeetCode,934
From: https://blog.51cto.com/u_15567308/6431283

相关文章

  • LeetCode 907.子数组的最小值之和
    LeetCode907.子数组的最小值之和本题由于每一项都需要遍历到,所以我们要计算所有可能的排列组合情况,所以这道题我们应该从每个元素分别出发,构建单调栈,找到每个元素左边和右边第一个比他小的元素,在这个区间范围内,我们可以断定任何一个子区间得到的最小值都是当前选定这个元素,所以最......
  • 【LeetCode】11月每日一题刷题记录
    575.分糖果classSolution{public:intdistributeCandies(vector<int>&candyType){unordered_set<int>S;for(autoc:candyType)S.insert(c);returnmin(candyType.size()/2,S.size());}};237.删除链表中的节点由于是单链表......
  • LeetCode 862.和至少为k的最短子数组
    LeetCode862.和至少为k的最短子数组本题前缀和队列并不单调,所以应该算变种单调队列,在计算出单调队列以后还要进行进一步优化,即在如下条件如果我们找到当前的s[i]满足条件,则说明之后选取的s[i]不管是多少,均没有当前s[i]距离s[j]近,所以在此以后的值均可以丢弃,同理,s[j]之前的值也是......
  • LeetCode 388.文件的最长绝对路径
    题目链接思路针对文件路径的特征,一个文件中一定包含.分隔符,以此为依据可以判定当前字符串是否是一个文件,文件系统是一个树形结构的角度来看的话,题中给定的字符串实际上是以一个树形结构前序遍历的序列,连续的\t表示出了当前的深度,而相邻的节点之间以\n进行分割。假设当前的路径为x/......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉树的右视图
    1.简述:给定一个二叉树的根节点root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例1:输入: [1,2,3,null,5,null,4]输出: [1,3,4]示例2:输入: [1,null,3]输出: [1,3]示例3:输入: []输出: []2.代码实现:classSolution{publicList<I......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉树中的最大路径和
    题目:二叉树中的路径被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中至多出现一次。该路径至少包含一个节点,且不一定经过根节点。路径和是路径中各节点值的总和。给你一个二叉树的根节点root,返回其最大路径和。 示例1:输入:root=......
  • Leetcode 2352. 相等行列对
    题目:给你一个下标从0开始、大小为nxn的整数矩阵grid,返回满足\(R_i\)行和\(C_j\)列相等的行列对(\(R_i\),\(C_j\))的数目。如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。难度:中等示例1:输入:grid=[[3,2,1],[1,7,6],[2,7,7]]输出:1......
  • [LeetCode] 1347. Minimum Number of Steps to Make Two Strings Anagram 制造字母异
    Youaregiventwostringsofthesamelength s and t.Inonestepyoucanchoose anycharacter of t andreplaceitwith anothercharacter.Return theminimumnumberofsteps tomake t ananagramof s.An Anagram ofastringisastringthatco......
  • leetcode-图论总结
    此文总结一下常见图论算法,代码可以为后续遇见类似题目提供参考:1.图的表示:邻接矩阵:可通过创建数组得到邻接表:我个人喜欢通过LinkedList<int[]>[]graph=newLinkedList[n];得到。EdgeList:同样可以通过LinkedList<int[]>[]graph=newLinkedList[n];得到。2.图遍历:DF......
  • 树之深度优先遍历算法详解(DFS实现) LeetCode94
           本文以如下树结构为例深度优先(DeepFirstSearch)       树的孩子称作子树,对于一个树进行深度优先遍历,即将其某一子树下所有节点遍历完再去遍历其他子树。遍历的顺序以根为参照可分为先序遍历,中序遍历,后序遍历。遍历方式描述先序遍历根左右中序遍历左根右后......