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

devtools/2025/3/14 18:07:10/

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;// markmatrix[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 MScanner 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();}}// dfsfor(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. isEmptyQueue<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 MScanner 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();}}// bfsfor(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;// markmatrix[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 MScanner 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();}}// dfsfor(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+" ");elseSystem.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.ppmy.cn/devtools/167078.html

相关文章

内网渗透之内网基础知识(一)

工作组 工作组:工作组是局域网中的一个概念&#xff0c;他是长久的资源管理模式。默认情况下使 用工作组方式进行资源管理&#xff0c;将不同的 computer 按照不同的要求分类到不同的组 域:用来描述一种架构&#xff0c;和“工作组”相对应&#xff0c;由工作组升级而来的高级…

用Deepseek写一个五子棋微信小程序

在当今快节奏的生活中&#xff0c;休闲小游戏成为了许多人放松心情的好选择。五子棋作为一款经典的策略游戏&#xff0c;不仅规则简单&#xff0c;还能锻炼思维。最近&#xff0c;我借助 DeepSeek 的帮助&#xff0c;开发了一款五子棋微信小程序。在这篇文章中&#xff0c;我将…

投资早报 3.13

一、 市场概述 1.全网加密货币总市值为2.80万亿美元&#xff0c;24小时交易量为1229.116亿美元。比特币(BTC)市值占比为59.3%&#xff0c;以太坊市值占比为8.21%。 2.美股三大指数涨跌不一&#xff0c;其中标普500指数涨0.49%&#xff0c;报5599.30点&#xff1b;道琼斯指数跌…

vscode调试python量化项目经验

第一步&#xff1a;安装插件&#xff0c;如下图&#xff0c;这款几款vscode插件都装上&#xff1a; 第二步&#xff1a;新建文件如上图所示&#xff0c;在项目根目录下新建.vscode文件夹&#xff0c;该文件夹下新建launch.json文件 launch.json里的配置代码如下&#xff1a; {…

ubuntu20 安装、配置Gitlab

1. 安装依赖 sudo apt update sudo apt install ca-certificates curl openssh-server postfix 对于postfix的安装&#xff0c;请在出现提示时选择“ Internet站点”&#xff0c;其余选项按默认值即可。 2. 下载安装gitlab 下载 sudo apt-get install wget wget -P /Downlo…

【Academy】服务器端模板注入 ------ Server-side template injection

服务器端模板注入 ------ Server-side template injection 1. 什么是服务器端模板注入&#xff1f;2. 服务器端模板注入有什么影响&#xff1f;3. 服务器端模板注入漏洞是如何产生的&#xff1f;4. 构建服务器端模板注入4.1 检测4.1.1 纯文本上下文4.1.2 代码上下文 4.2 识别4.…

Matplotlib

Matplotlib 使用前需要先导入模块 import matplotlib.pyplot as plt import numpy as np绘制x点和y点 plot()函数用于在图表中绘制点&#xff08;标记&#xff09; 默认情况下&#xff0c;会从点到点之间绘制一条直线 参数1是一个包含x轴上点的数组 参数2是一个包含y轴上点的…

HTML5(Web前端开发笔记第一期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 三件套标签标题标签段落标签文本格式化标签图像标签超链接标签锚点链接默认链接地址 音频标签视频标签 HTML基本骨架综合案例->个人简介列表表格表单input标签单选框radio上传…