图论part3|101.孤岛的总面积、沉没孤岛、417. 太平洋大西洋水流问题

news2025/3/14 15:23:17

101. 孤岛的总面积

  • 🔗:101. 孤岛的总面积
  • 思路:和昨天的岛的区别是:是否有挨着边的岛屿
    • 所以可以先遍历四条边挨着的岛屿,把他们标记为非孤岛
    • 再计算其他岛屿当中的最大面积
  • 代码:(深度搜索)
  • import java.util.*;
    /*
        思路:
        和岛的区别是:是否有挨着边的岛屿
        --所以可以先遍历四条边挨着的岛屿,把他们标记为非孤岛
        --再计算其他岛屿当中的最大面积
    */
    public class Main{
        
        public static int count = 0;
    
        public static void dfs(int[][] matrix,int i,int j, int aim){
            // 终止条件
            if(i>=matrix.length || i<0 || j<0 || j>=matrix[0].length) return;
            if(matrix[i][j]!=1) return;
            // mark
            matrix[i][j] = aim;
            count++;
            // 遍历
            dfs(matrix, i, j-1, aim);
            dfs(matrix, i, j+1, aim);
            dfs(matrix, i-1, j, aim);
            dfs(matrix, i+1, j, aim);
    
        }
        public static void main(String[] args){
            // N M
            Scanner scanner = new Scanner(System.in);
            int row = scanner.nextInt();
            int col = scanner.nextInt();
            int[][] matrix = new int [row][col];
            for(int i=0; i<row; i++){
                for(int j=0; j<col; j++){
                    matrix[i][j] = scanner.nextInt();
                }
            }
            // dfs
            for(int i=0; i<row; i++){
                if(matrix[i][0]==1)
                    dfs(matrix, i, 0, 2);
                if(matrix[i][col-1]==1)
                    dfs(matrix, i, col-1,2);
            }
    
            for(int j=0; j<col; j++){
                if(matrix[0][j]==1)
                    dfs(matrix,0,j,2);
                if(matrix[row-1][j] == 1)
                    dfs(matrix,row-1,j,2);
            }
    
            count=0;
            for(int i=1; i<row; i++){
                for(int j=1; j<col; j++){
                    if(matrix[i][j]==1){
                        dfs(matrix, i, j, 3);
                    }
                }
            }
            System.out.println(count);
    
        }
    
    }

  • 代码:广度搜索
import java.util.*;
/*
    思路:
    和岛的区别是:是否有挨着边的岛屿
    --所以可以先遍历四条边挨着的岛屿,把他们标记为非孤岛
    --再计算其他岛屿当中的最大面积
*/
public class Main{
    
    public static int count = 0;
    private static final int[][] dir = {{0,1},{1,0},{0,-1},{-1,0}};

    public static void bfs(int[][] matrix,int r,int c, int aim){
        // queue, linkedlist
        // method: poll. add. isEmpty
        Queue<int[]> que = new LinkedList<>();
        que.add(new int[]{r,c});
        matrix[r][c] = aim;
        count++;
        while(!que.isEmpty()){
            int[] cur = que.poll();
            int row = cur[0];
            int col = cur[1];
            for(int i=0; i<4; i++){
                int nr = row + dir[i][0];
                int nc = col + dir[i][1];
                if(nr<0||nc<0||nr>=matrix.length||nc>=matrix[0].length)
                continue;
                if(matrix[nr][nc]==1){
                    que.add(new int[]{nr,nc});
                    count++;
                    matrix[nr][nc] = aim;
                }
            }

        }

    }
    public static void main(String[] args){
        // N M
        Scanner scanner = new Scanner(System.in);
        int row = scanner.nextInt();
        int col = scanner.nextInt();
        int[][] matrix = new int [row][col];
        for(int i=0; i<row; i++){
            for(int j=0; j<col; j++){
                matrix[i][j] = scanner.nextInt();
            }
        }
        // bfs
        for(int i=0; i<row; i++){
            if(matrix[i][0]==1)
                bfs(matrix, i, 0, 2);
            if(matrix[i][col-1]==1)
                bfs(matrix, i, col-1,2);
        }

        for(int j=0; j<col; j++){
            if(matrix[0][j]==1)
                bfs(matrix,0,j,2);
            if(matrix[row-1][j] == 1)
                bfs(matrix,row-1,j,2);
        }

        count=0;
        for(int i=1; i<row; i++){
            for(int j=1; j<col; j++){
                if(matrix[i][j]==1){
                    bfs(matrix, i, j, 3);
                }
            }
        }
        System.out.println(count);

    }

}

102. 沉没孤岛

  • 🔗:102. 沉没孤岛
  • 思路:感受不到和上一题太大的区别
  • 代码:(dfs)
    • import java.util.*;
      /*
          思路:
          
      */
      public class Main{
           
       
          public static void dfs(int[][] matrix,int i,int j, int aim){
              // 终止条件
              if(i>=matrix.length || i<0 || j<0 || j>=matrix[0].length) return;
              if(matrix[i][j]!=1) return;
              // mark
              matrix[i][j] = aim;
              // 遍历
              dfs(matrix, i, j-1, aim);
              dfs(matrix, i, j+1, aim);
              dfs(matrix, i-1, j, aim);
              dfs(matrix, i+1, j, aim);
       
          }
          public static void main(String[] args){
              // N M
              Scanner scanner = new Scanner(System.in);
              int row = scanner.nextInt();
              int col = scanner.nextInt();
              int[][] matrix = new int [row][col];
              for(int i=0; i<row; i++){
                  for(int j=0; j<col; j++){
                      matrix[i][j] = scanner.nextInt();
                  }
              }
              // dfs
              for(int i=0; i<row; i++){
                  if(matrix[i][0]==1)
                      dfs(matrix, i, 0, 2);
                  if(matrix[i][col-1]==1)
                      dfs(matrix, i, col-1,2);
              }
       
              for(int j=0; j<col; j++){
                  if(matrix[0][j]==1)
                      dfs(matrix,0,j,2);
                  if(matrix[row-1][j] == 1)
                      dfs(matrix,row-1,j,2);
              }
       
              for(int i=0; i<row; i++){
                  for(int j=0; j<col; j++){
                      if(matrix[i][j] == 2)
                         System.out.print(1+" ");
                      else
                          System.out.print(0 + " "); 
                  }
                  System.out.print("\n");
              }
       
          }

417. 太平洋大西洋水流问题

  • 🔗:
    417. 太平洋大西洋水流问题https://leetcode.cn/problems/pacific-atlantic-water-flow/
  • 思路:
    • 这一题题目有一点难以理解,当时大体上有了前两题的铺垫还是比较好做的。
    • 题意大概是:左上两条边连接pacific,右下两条边连接Atlantic,雨水可以流向小于等于高度的方向(东南西北),求同时可以流向太平洋和大西洋的方块。
    • 这题可以分成两部分来看,首先找到可以流向pacific的点,然后找到可以流向Atlantic的点,求它们的交集。
      • 存储方式:我一开始想到的是用三维数组进行存储,当时两个二维数组的方式可能更好写一些(没有太大区别)
    • 遍历方式:采用深度优先遍历,遍历过的点都设置为true(有一点像岛屿问题),如果不能延伸则return(返回条件,即相邻岛屿高度<目前岛屿高度)
  • 代码:
    • class Solution {
          static int[][] dirs = {{-1,0},{1,0},{0,-1},{0,1}};
          int[][] heights;
          int m,n;
      
          public List<List<Integer>> pacificAtlantic(int[][] heights) {
              this.heights = heights;
              this.m = heights.length;
              this.n = heights[0].length;
              boolean[][] pacific = new boolean[m][n];
              boolean[][] atlantic = new boolean[m][n];
              for(int i=0; i<m; i++){
                  dfs(i, 0, pacific);
              }    
               for(int i=0; i<m; i++){
                  dfs(i, n-1, atlantic);
              }
              for(int j=1; j<n;j++){
                  dfs(0,j,pacific);
              }           
              for(int j=0; j<n-1; j++){
                  dfs(m-1,j,atlantic);
              }
              List<List<Integer>> result = new ArrayList<>();
              for(int i=0; i<m; i++){
                  for(int j=0; j<n; j++){
                      if(pacific[i][j] && atlantic[i][j]){
                          List<Integer> cell = new ArrayList<>();
                          cell.add(i);
                          cell.add(j);
                          result.add(cell);
                      }
                  }
              }
              return result;
          }
      
          public void dfs(int row, int col, boolean[][] ocean){
              if(ocean[row][col]) return;
              ocean[row][col] = true;
              for(int[] dir:dirs){
                  int newRow = row + dir[0];
                  int newCol = col + dir[1];
                  if(newRow>=0 && newCol>=0 && newRow<m && newCol<n && heights[newRow][newCol]>=heights[row][col]){
                      dfs(newRow, newCol, ocean);
                  }
              }
          }
      }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2314943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

江科大51单片机笔记【12】AT24C02(I2C总线)

写在前言 此为博主自学江科大51单片机&#xff08;B站&#xff09;的笔记&#xff0c;方便后续重温知识 在后面的章节中&#xff0c;为了防止篇幅过长和易于查找&#xff0c;我把一个小节分成两部分来发&#xff0c;上章节主要是关于本节课的硬件介绍、电路图、原理图等理论知识…

网络安全防护架构有哪些 网络安全防护措施包括

网络安全预防措施 网安措施 计算机网络安全措施主要包括保护网络安全、保护应用服务安全和保护系统安全三个方面&#xff0c;各个方面都要结合考虑安全防护的物理安全、防火墙、信息安全、Web安全、媒体安全等等。 (一)保护网络安全。 网络安全是为保护商务各方网络端系统之…

大模型架构记录5-向量数据库

一 倒排索引、KNN、PQ 1.1 基础版本 query -> requery 对问题做处理&#xff0c;处理上下文 对query 做 refined query 1.2 向量数据库 二 搜索逻辑 2.1 knn 2.2 近似KNN 先和N个空间的均值比较再和空间内部的所有点比较&#xff0c;计算最近值。 优化一&#xff1a; …

Linux:基本指令与内涵理解

1.文件操作指令 1.1 ls ls指令用于查看指定层级文件夹下的文件或文件夹 基本格式&#xff1a;ls (选项) (查看层级&#xff09; 其中选项处不写就默认是显示文件名&#xff0c;查看层级默认是当前层级 选项1&#xff1a; -l 作用&#xff1a;将查找文件的详细信息显示出来 我们…

使用DeepSeek完成一个简单嵌入式开发

开启DeepSeek对话 请帮我使用Altium Designer设计原理图、PCB&#xff0c;使用keil完成代码编写&#xff1b;要求&#xff1a;使用stm32F103RCT6为主控芯片&#xff0c;控制3个流水灯的原理图 这里需要注意&#xff0c;每次DeepSeek的回答都不太一样。 DeepSeek回答 以下是使…

关于我和快速幂的事()

我之前只会这样的(dfs&#xff09;&#xff1a; 不懂下面这种写法的具体逻辑&#xff1a; 看完下面的推理&#xff0c;再转转我聪明的小老戴&#xff1a; 法一中&#xff1a;把2^11看成(2^5)^2 法二中&#xff1a;把2^11看成(2^2)^5

【鸿蒙开发】Hi3861学习笔记- GPIO之直流电机

00. 目录 文章目录 00. 目录01. GPIO概述02. 直流电机概述03. ULN2003模块概述04. 硬件设计05. 软件设计06. 实验现象07. 附录 01. GPIO概述 GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出。通常&#xff0c;GPIO控制器通过分组的方式管理所有GP…

mapbox高阶,结合threejs(threebox)添加extrusion挤出几何体,并添加侧面窗户贴图和楼顶贴图,同时添加真实光照投影

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️threebox extrusion挤出几何体1.3 ☘️…

python-leetcode-叶子相似的树

872. 叶子相似的树 - 力扣&#xff08;LeetCode&#xff09; 下面是一个完整的 Python 函数&#xff0c;接收两个二叉树的根节点 root1 和 root2&#xff0c;返回它们是否叶相似。 代码实现 class TreeNode:def __init__(self, val0, leftNone, rightNone):self.val valself…

<03.13>八股文补充知识

import java.lang.reflect.*; public class Main {public static void main(String[] args) throws Exception {// 获取 Class 对象//1. 通过类字面量Class<?> clazz Person.class;//2 通过对象实例化String str "Hello";Class<?> clazz_str str.ge…

2025探索短剧行业新可能报告40+份汇总解读|附PDF下载

原文链接&#xff1a;https://tecdat.cn/?p41043 近年来&#xff0c;短剧以其紧凑的剧情、碎片化的观看体验&#xff0c;迅速吸引了大量用户。百度作为互联网巨头&#xff0c;在短剧领域积极布局。从早期建立行业专属模型冷启动&#xff0c;到如今构建完整的商业生态&#xf…

STM32 内置的通讯协议

数据是以帧为单位发的 USART和UART的区别就是有没有同步功能 同步是两端设备有时钟连接&#xff0c;异步是没时钟连接&#xff0c;靠约定号的频率&#xff08;波特率&#xff09;接收发送数据 RTS和CTS是用来给外界发送已“可接收”或“可发送”信号的&#xff0c;一般用不到…

信息安全访问控制、抗攻击技术、安全体系和评估(高软42)

系列文章目录 信息安全访问控制、抗攻击技术、安全体系和评估 文章目录 系列文章目录前言一、信息安全技术1.访问控制2.抗攻击技术 二、欺骗技术1.ARP欺骗2.DNS欺骗3.IP欺骗 三、抗攻击技术1.端口扫描2.强化TCP/IP堆栈 四、保证体系和评估1.保证体系2.安全风险管理 五、真题在…

晋升系列4:学习方法

每一个成功的人&#xff0c;都是从底层开始打怪&#xff0c;不断的总结经验&#xff0c;一步一步打上来的。在这个过程中需要坚持、总结方法论。 对一件事情长久坚持的人其实比较少&#xff0c;在坚持的人中&#xff0c;不断的总结优化的更少&#xff0c;所以最终达到高级别的…

脑电波控制设备:基于典型相关分析(CCA)的脑机接口频率精准解码方法

文章目录 前言一、CCA的用途二、频率求解思路三、输入数据结构四、判断方法五、matlab实践1.数据集获取及处理2.matlab代码3.运行及结果 六、参考文献 前言 在脑机接口(BCI)领域&#xff0c;有SSVEP方向&#xff0c;中文叫做稳态视觉诱发电位&#xff0c;当人观看闪烁的视觉刺激…

Android Spinner总结

文章目录 Android Spinner总结概述简单使用自定义布局自定义Adapter添加分割线源码下载 Android Spinner总结 概述 在 Android 中&#xff0c;Spinner 是一个下拉选择框。 简单使用 xml布局&#xff1a; <Spinnerandroid:id"id/spinner1"android:layout_width&…

element-ui layout 组件源码分享

layout 布局组件源码分享&#xff0c;主要从以下两个方面&#xff1a; 1、row 组件属性。 2、col 组件属性。 一、row 组件属性。 1.1 gutter 栅栏间隔&#xff0c;类型为 number&#xff0c;默认 0。 1.2 type 布局模式&#xff0c;可选 flex&#xff0c;现代浏览器下有效…

OBJ文件生成PCD文件(python 实现)

代码实现 将 .obj 文件转换为 .pcd&#xff08;点云数据&#xff09; 代码文件。 import open3d as o3d# 加载 .obj 文件 mesh o3d.io.read_triangle_mesh("bunny.obj")# 检查是否成功加载 if not mesh.has_vertices():print("无法加载 .obj 文件&#xff0c…

c++介绍智能指针 十二(1)

普通指针&#xff1a;指向内存区域的地址变量。使用普通指针容易出现一些程序错误。 如果一个指针所指向的内存区域是动态分配的&#xff0c;那么这个指针变量离开了所在的作用域&#xff0c;这块内存也不会自动销毁。动态内存不进行释放就会导致内存泄露。如果一个指针指向已…

Appium等待机制--强制等待、隐式等待、显式等待

书接上回&#xff0c;Appium高级操作--其他操作-CSDN博客文章浏览阅读182次&#xff0c;点赞6次&#xff0c;收藏7次。书接上回Appium高级操作--从源码角度解析--模拟复杂手势操作-CSDN博客。https://blog.csdn.net/fantasy_4/article/details/146162851主要讲解了Appium的一些…