首页 > 编程语言 >[LeetCode] 最短的桥 双BFS Java

[LeetCode] 最短的桥 双BFS Java

时间:2024-05-09 13:33:22浏览次数:24  
标签:Java point int 复杂度 BFS grid && new LeetCode

Problem: 934. 最短的桥

目录

思路

先找到第一个岛屿,根据每一个岛屿的岛屿块的位置
多源查找这个块与第二个岛屿的距离,先找到的就是最少的距离
同时,将已遍历过的岛屿标记为-1,避免重复入队

复杂度

时间复杂度:

添加时间复杂度, 示例: $O(n^2)$

空间复杂度:

添加空间复杂度, 示例: $O(n^2)$

Code

class Solution {
    public int shortestBridge(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        int[][] dir = new int[][]{{-1,0}, {1, 0}, {0, -1}, {0, 1}};
        List<int[]> firstIsland = new ArrayList<>();
        Queue<int[]> queue = new LinkedList<>();
        // 找到第一个岛屿
        // -1 标记已经遍历过
        loop:for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if(grid[i][j] == 1){
                    queue.offer(new int[]{i, j});
                    grid[i][j] = -1;
                    break loop;
                }
            }
        }
        while(!queue.isEmpty()){
            int[] point = queue.poll();
            firstIsland.add(point);
            for (int i = 0; i < 4; i++) {
                int x = point[0] + dir[i][0];
                int y = point[1] + dir[i][1];
                if(x>=0&& x<m && y>=0 && y<n && grid[x][y] == 1){
                    queue.offer(new int[]{x, y});
                    grid[x][y] = -1;
                }
            }
        }
        // 把找到的岛屿块入队
        for(int[] island : firstIsland){
            queue.offer(island);
        }
        // 查找第二个岛屿
        int step = 0;
        while(!queue.isEmpty()){
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                int[] point = queue.poll();
                for (int k = 0; k < 4; k++) {
                    int x = point[0] + dir[k][0];
                    int y = point[1] + dir[k][1];
                    if(x>=0&& x<m && y>=0 && y<n){
                        if(grid[x][y] == 0) {
                            queue.offer(new int[]{x, y});
                            grid[x][y] = -1;
                        }else if (grid[x][y] == 1){
                            return step;
                        }
                    }
                }
            }
            step++;
        }
        return 0;
    }
}

标签:Java,point,int,复杂度,BFS,grid,&&,new,LeetCode
From: https://www.cnblogs.com/xiaofengs/p/18181972

相关文章

  • LeetCode 1186. Maximum Subarray Sum with One Deletion
    原题链接在这里:https://leetcode.com/problems/maximum-subarray-sum-with-one-deletion/description/题目:Givenanarrayofintegers,returnthemaximumsumfora non-empty subarray(contiguouselements)withatmostoneelementdeletion. Inotherwords,youwa......
  • 国密算法SM2-java实现
    Maven依赖<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.56</version></dependency>工具类importjava.math.BigInteger;publicclassUtil{......
  • java测试框架Junit5进阶知识点
    声明参数化导入注解<!--junit5新的编程和扩展模型--><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter</artifactId><version>5.8.2</version>......
  • Java-读取resource目录下的文件并返回给前端
    我在项目的resource目录下面放了一个模板文件,用来供用户下载提供一个接口给前端,用来下载在Utils类下面写个方法来读取代码publicstaticvoidgetXMindTemplate(HttpServletResponseresponse){StringfileName="templates/TestCaseTemplate.xmind";//文件名称ClassPa......
  • Java-LocalDateTime时间和时间(时间加减)
    前言一开始使用Date类来表述时间属性一个问题是时间戳的问题,另一个问题是读取Excel数据格式的时候没有那么灵活 1.基本知识LocalDateTime是Java8引入的日期和时间API中的一个类,位于java.time包中。它提供了一种更灵活、更方便的方式来处理日期和时间,相比旧的Date类更为......
  • LeetCode 2210. Count Hills and Valleys in an Array
    原题链接在这里:https://leetcode.com/problems/count-hills-and-valleys-in-an-array/description/题目:Youaregivena 0-indexed integerarray nums.Anindex i ispartofa hill in nums iftheclosestnon-equalneighborsof i aresmallerthan nums[i].......
  • java 多线程CountDownLatch
     CountDownLatch简介CountDownLatch 是Java中的一个同步工具类,可以用来确保一组线程等待其他线程完成各自工作后再继续执行。CountDownLatch的应用场景CountDownLatch可以被广泛应用于各种多线程协作的场景,例如:主线程等待多个子线程完成后再执行下一步操作。多个子任......
  • Java学设计模式之工厂模式
    一、工厂模式概念工厂模式是一种创建型设计模式,用于创建对象而不需要暴露对象的创建逻辑。它将对象的实例化过程封装在一个单独的类中,使得客户端代码只需通过调用工厂类的方法来获取所需的对象,而无需关心具体的实例化过程。工厂模式通常有三种主要的变体:简单工厂模式、工厂方法......
  • 关于Java Chassis 3的契约优先(API First)开发
    本文分享自华为云社区《JavaChassis3技术解密:契约优先(APIFirst)开发》,作者:liubao68。契约优先(APIFirst)开发是指应用程序开发过程中,将API设计作为第一优先级的任务。契约优先开发随着WebServices概念的发展而不断得到重视,特别是微服务架构出现以后,API设计成为影响功能开放、......
  • 如果你还不了解 Java Class 文件结构,来看看这篇吧
    文章首发于【Java天堂】,跟随我探索Java进阶之路!Class文件是什么JavaClass文件是Java编译器将源代码编译后的二进制表示,它是Java虚拟机(JVM)运行的基础。Class文件绝大部分内容是在1997年发布的第一版《Java虚拟机规范》中就已经定义好的,后续20多年的发展过程当中Java经历了大......