力扣图论篇

以下思路来自代码随想录以及官方题解。

文章目录

      • 797.所有可能的路径
      • 200.岛屿数量
      • 130.被围绕的区域
      • 1020.飞地的数量

797.所有可能的路径

给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)
graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。
在这里插入图片描述

输入:graph = [[1,2],[3],[3],[]]
输出:[[0,1,3],[0,2,3]]
解释:有两条路径 0 -> 1 -> 30 -> 2 -> 3

在这里插入图片描述

输入:graph = [[4,3,1],[3,2,4],[3],[4],[]]
输出:[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]
class Solution {// 存储所有路径的结果List<List<Integer>> ans = new ArrayList<List<Integer>>();// 用于深度优先搜索的栈Deque<Integer> stack = new ArrayDeque<Integer>();public List<List<Integer>> allPathsSourceTarget(int[][] graph) {// 将起始节点0加入栈中stack.offerLast(0);// 从起始节点0开始进行深度优先搜索,目标节点为graph.length - 1dfs(graph, 0, graph.length - 1);// 返回所有路径的结果return ans;}public void dfs(int[][] graph, int x, int n) {// 如果当前节点x等于目标节点n,说明找到了一条路径if (x == n) {// 将当前栈中的路径添加到结果列表中ans.add(new ArrayList<Integer>(stack));// 返回上一层递归return;}// 遍历当前节点x的所有邻居节点yfor (int y : graph[x]) {// 将邻居节点y加入栈中stack.offerLast(y);// 从邻居节点y开始继续进行深度优先搜索dfs(graph, y, n);// 回溯:将邻居节点y从栈中移除stack.pollLast();}}
}

200.岛屿数量

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。

输入:grid = [["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0","0","0","0","0"]
]
输出:1输入:grid = [["1","1","0","0","0"],["1","1","0","0","0"],["0","0","1","0","0"],["0","0","0","1","1"]
]
输出:3
class Solution {// 深度优先搜索函数,用于遍历岛屿public void dfs(char[][] grid, int r, int c) {int nr = grid.length; // 获取行数int nc = grid[0].length; // 获取列数// 如果越界或者当前位置不是岛屿,直接返回if (r < 0 || c < 0 || r >= nr || c >= nc || grid[r][c] == '0') {return;}// 将当前位置标记为已访问grid[r][c] = '0';// 向上、下、左、右四个方向进行深度优先搜索dfs(grid, r - 1, c);dfs(grid, r + 1, c);dfs(grid, r, c - 1);dfs(grid, r, c + 1);}// 计算岛屿数量的函数public int numIslands(char[][] grid) {// 如果输入为空或者没有元素,直接返回0if (grid == null || grid.length == 0) {return 0;}int nr = grid.length; // 获取行数int nc = grid[0].length; // 获取列数int num_idlands = 0; // 初始化岛屿数量为0// 遍历整个网格for (int r = 0; r < nr; r++) {for (int c = 0; c < nc; c++) {// 如果当前位置是岛屿(值为'1')if (grid[r][c] == '1') {num_idlands++; // 岛屿数量加1dfs(grid, r, c); // 从当前位置开始进行深度优先搜索,将相邻的岛屿都标记为已访问}}}return num_idlands; // 返回岛屿数量}
}

130.被围绕的区域

给你一个 m x n 的矩阵 board ,由若干字符 'X''O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 ‘O’ 用 'X' 填充。

在这里插入图片描述

输入:board = [["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]]
输出:[["X","X","X","X"],["X","X","X","X"],["X","X","X","X"],["X","O","X","X"]]
解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都不会被填充为 'X'。 任何不在边界上,或不与边界上的 'O' 相连的 'O' 最终都会被填充为 'X'。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。输入:board = [["X"]]
输出:[["X"]]

1020.飞地的数量

给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。

一次 移动 是指从一个陆地单元格走到另一个相邻**(上、下、左、右)**的陆地单元格或跨过 grid 的边界。

返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。

在这里插入图片描述

输入:grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0],[0,0,0,0]]
输出:3
解释:有三个 10 包围。一个 1 没有被包围,因为它在边界上。

在这里插入图片描述

输入:grid = [[0,1,1,0],[0,0,1,0],[0,0,1,0],[0,0,0,0]]
输出:0
解释:所有 1 都在边界上或可以到达边界。

这道题是官方题解

class Solution {// 定义四个方向的偏移量public static int[][] dirs = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };private int m, n; // 行数和列数private boolean[][] visited; // 记录是否访问过public int numEnclaves(int[][] grid) {m = grid.length; // 获取行数n = grid[0].length; // 获取列数visited = new boolean[m][n]; // 初始化访问数组// 遍历第一列和最后一列for (int i = 0; i < m; i++) {dfs(grid, i, 0); // 深度优先搜索第一列dfs(grid, i, n - 1); // 深度优先搜索最后一列}// 遍历第一行和最后一行(不包括第一列和最后一列)for (int j = 1; j < n - 1; j++) {dfs(grid, 0, j); // 深度优先搜索第一行dfs(grid, m - 1, j); // 深度优先搜索最后一行}int count = 0; // 记录未被访问过的陆地数量// 遍历除第一行、最后一行、第一列、最后一列之外的区域for (int i = 1; i < m - 1; i++) {for (int j = 1; j < n - 1; j++) {if (grid[i][j] == 1 && !visited[i][j]) { // 如果当前位置是陆地且未被访问过count++; // 计数器加一}}}return count; // 返回未被访问过的陆地数量}// 深度优先搜索函数public void dfs(int[][] grid, int row, int col) {// 如果越界或者当前位置是水域或者已经访问过,直接返回if (row < 0 || row >= m || col < 0 || col >= n || grid[row][col] == 0 || visited[row][col]) {return;}visited[row][col] = true; // 标记当前位置已访问// 遍历四个方向进行深度优先搜索for (int[] dir : dirs) {dfs(grid, row + dir[0], col + dir[1]);}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio 检测不到 IDE 更新

点击 Configure updates...&#xff0c;不知道什么时候把 Check for IDE updates 去勾了&#xff0c;一年没有检测到更新&#xff01; 只能重新安装&#xff0c;掉坑里了&#xff01;

最顶级的Unity团队都在使用的技巧!!!

作为该系列的第二篇文章&#xff0c;今天将给大家分享一下&#xff0c;Unity最资深的团队是如何设置物理、UI和音频的。希望可以帮助大家最大限度的使用Unity引擎。 第一篇给大家介绍了如何提高资源、项目配置和图形的性能&#xff0c;感兴趣的朋友千万不要错过了。 文章链接…

VScode---php环境搭建

文章目录 1.下载php Dehug;php server2.下载php环境3.配置环境变量5.配置php.ini文件6.设置vscode6.测试遇到的问题 1.下载php Dehug;php server 2.下载php环境 下载地址&#xff1a;https://www.php.net/downloads.php 3.配置环境变量 C:\Users\hacker>php -v PHP 8.3.3 (…

【Web开发】深度学习HTML(超详细,一篇就够了)

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Web开发】深度学习html(超详细,一篇就够了) &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 HTML1. HTML基础1.1 什么是HTML1.2 认识HTML标签1.3 HTML文件基本…

网络学习:数据链路层Ethernet II协议详解

前言&#xff1a; Ethernet II协议位于数据链路层&#xff0c;其包含MAC地址、数据类型和上层的数据报。 一、MAC地址格式 组织唯一标识符&#xff08;OUI&#xff09;24bit厂商分配&#xff08;EUI)I/GG/L22bit24bit 组织唯一标识符&#xff08;OUI&#xff09;&#xff1a; …

最新基于R语言lavaan结构方程模型(SEM)技术应用

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;是分析系统内变量间的相互关系的利器&#xff0c;可通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、…

全球AI人才报告曝光:清华第三,北大第六!硅谷40万人大裁员,码农地狱级面试12场

就在刚刚&#xff0c;全球AI人才报告发布。 全世界的顶尖AI人才中&#xff0c;由中国培养出的人才已经占到了近1/2&#xff01; 有趣的是&#xff0c;当这些人卷到美国后&#xff0c;当地程序员的日子&#xff0c;似乎是越来越难了。 不断压低的薪资&#xff0c;无休止的面试…

难❗️计算机考研408难度又破新高!

24年408考研&#xff0c;如果只用王道的复习资料&#xff0c;最多考100-120分 就是这么的现实&#xff0c;王道的资料虽然好&#xff0c;但是并不能覆盖全部的知识点和考点&#xff0c;而且24年的408真题考的很怪&#xff0c;总结起来就是下面这些特点&#xff1a; 偏&#x…

浅浅的了解 autoconf:当开源项目不再自带 configure 文件

背景 在开源软件的世界里&#xff0c;开发者可以自己编译和安装需要的组件&#xff0c;这也是我喜欢开源项目的原因之一。然而&#xff0c;就在昨天&#xff0c;当我尝试编译一个颇具吸引力的开源项目时&#xff0c;我意外地发现该项目并没有包含通常所见的 configure 脚本&am…

线程-创建线程的方法、线程池

1.创建线程一共有哪几种方法&#xff1f; 继承Thread类创建线程 继承Thread类&#xff0c;重写run()方法&#xff0c;在main()函数中调用子类的strat()方法 实现Runnable接口创建线程 先创建实现Runnable接口的类&#xff0c;重写run()方法&#xff0c;创建类的实例对象&#…

【go语言开发】redis简单使用

本文主要介绍redis安装和使用。首先安装redis依赖库&#xff0c;这里是v8版本&#xff1b;然后连接redis&#xff0c;完成基本配置&#xff1b;最后测试封装的工具类 文章目录 安装redis依赖库连接redis和配置工具类封装代码测试 欢迎大家访问个人博客网址&#xff1a;https://…

二叉树进阶--二叉搜索树的进一步优化--AVL树 Self-balancing binary search tree

前言&#xff1a; 在上一次的文章中&#xff0c;我们详细介绍了二叉树的进阶树型&#xff0c;即BS树(二叉搜索树),但在文章的结尾&#xff0c;二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表…