当前位置: 首页 > news >正文

图论(dfs系列) 9/27

一、二维网格图中探测环

题意:

给定一个二维数组grid,如果二维数组中存在一个环,处于环上的值都是相同的。返回true;如果不存在就返回false;

思路:

在以往的dfs搜索中,都是往四个方向去dfs;但是在这一道题中,四个方向是不行的;如果第i次是从左往右过来的,那么i+1次,就不能从右往左再过

去。所以应该加上这个判断。

那我们就要走dfs函数上多加一个参数,from。

如果上一次不是从左边来的,那我们就可以往左走;

如果上一次不是从右边来的,那我们就可以往右走;

以此类推

    public void dfs(int x, int y, char ch, char from) {if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] != ch) {return;}if (visited[x][y]) {hasRing = true;return;}visited[x][y] = true;if (from != 'L')dfs(x, y - 1, ch, 'R');if (from != 'R')dfs(x, y + 1, ch, 'L');if (from != 'U')dfs(x-1, y, ch, 'D');if (from != 'D')dfs(x+1, y, ch, 'U');}
代码:
class Solution {boolean[][] visited;char[][] grid;int m, n;boolean hasRing;public boolean containsCycle(char[][] grid) {m = grid.length;n = grid[0].length;visited = new boolean[m][n];this.grid = grid;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (!visited[i][j]) {dfs(i, j, grid[i][j], 'L');if (hasRing) return true;}}}return false;}public void dfs(int x, int y, char ch, char from) {if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] != ch) {return;}if (visited[x][y]) {hasRing = true;return;}visited[x][y] = true;if (from != 'L')dfs(x, y - 1, ch, 'R');if (from != 'R')dfs(x, y + 1, ch, 'L');if (from != 'U')dfs(x-1, y, ch, 'D');if (from != 'D')dfs(x+1, y, ch, 'U');}
}

二、最大人工岛

思路:

1.首先找到所有的岛屿(连通块),将他们存储到map表中。可以使用一个值来标识一个连通块。

        Map<Integer,Integer> map=new HashMap<>();for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(grid[i][j]==1){int area=dfs(grid,i,j,islandIdx);//计算每一个连通块的大小map.put(islandIdx,area);//然后放到map里面保存islandIdx++;//maxArea=Math.max(area,maxArea);}}}

2.将所有的连通块找出来之后,然后枚举所有的海洋块。判断海洋块的周围有没有两个连通块(最多只能有两个连通块)。在枚举的同时,比较得出最大面积值。

        //枚举所有0的上下左右可能连接的情况for(int i=0;i<n;i++){for(int j=0;j<n;j++){Set<Integer> set=new HashSet<>();if(grid[i][j]==0){//左边的格子 如果是岛屿 就把岛屿编号放进来if(i-1>=0&&grid[i-1][j]>=2){set.add(grid[i-1][j]);}if(i+1<n&&grid[i+1][j]>=2){set.add(grid[i+1][j]);}if(j-1>=0&&grid[i][j-1]>=2){set.add(grid[i][j-1]);}if(j+1<n&&grid[i][j+1]>=2){set.add(grid[i][j+1]);}int curMaxArea=1;for(Integer index:set){int otherArea=map.get(index);curMaxArea+=otherArea;}maxArea=Math.max(maxArea,curMaxArea);}}}
代码:
class Solution {int n;public int largestIsland(int[][] grid) {n=grid.length;int maxArea=0,islandIdx=2;//对所有岛屿编号并记录在哈希表中Map<Integer,Integer> map=new HashMap<>();for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(grid[i][j]==1){int area=dfs(grid,i,j,islandIdx);//计算每一个连通块的大小map.put(islandIdx,area);//然后放到map里面保存islandIdx++;//maxArea=Math.max(area,maxArea);}}}//枚举所有0的上下左右可能连接的情况for(int i=0;i<n;i++){for(int j=0;j<n;j++){Set<Integer> set=new HashSet<>();if(grid[i][j]==0){//左边的格子 如果是岛屿 就把岛屿编号放进来if(i-1>=0&&grid[i-1][j]>=2){set.add(grid[i-1][j]);}if(i+1<n&&grid[i+1][j]>=2){set.add(grid[i+1][j]);}if(j-1>=0&&grid[i][j-1]>=2){set.add(grid[i][j-1]);}if(j+1<n&&grid[i][j+1]>=2){set.add(grid[i][j+1]);}int curMaxArea=1;for(Integer index:set){int otherArea=map.get(index);curMaxArea+=otherArea;}maxArea=Math.max(maxArea,curMaxArea);}}}return maxArea;       }public int dfs(int[][] grid,int x,int y,int count){if(!isArea(grid,x,y)||grid[x][y]==count||grid[x][y]!=1)return 0;grid[x][y]=count;return 1+dfs(grid,x-1,y,count)+dfs(grid,x+1,y,count)+dfs(grid,x,y-1,count)+dfs(grid,x,y+1,count);}public boolean isArea(int[][] grid, int x, int y) {if (x >= n || x < 0 || y < 0 || y >= n)return false;return true;}
}

相关文章:

图论(dfs系列) 9/27

一、二维网格图中探测环 题意: 给定一个二维数组grid,如果二维数组中存在一个环&#xff0c;处于环上的值都是相同的。返回true&#xff1b;如果不存在就返回false&#xff1b; 思路&#xff1a; 在以往的dfs搜索中&#xff0c;都是往四个方向去dfs&#xff1b;但是在这一道…...

如何在Windows上安装Docker

在 Windows 上使用 Docker 有两种主要方式&#xff1a;通过 Docker Desktop 安装并使用 WSL 2 作为后端&#xff0c;或者直接在 WSL 2 中安装 Docker。这里推荐手残党直接用图形界面安装到WSL 2的后端&#xff1a; 一、启用Hyper-V和容器特性 1. 右键Windows点击应用和功能 …...

golang格式化输入输出

fmt包使用类似于C的printf和scanf的函数实现格式化I/O 1输出格式化 一般的&#xff1a; 动词效果解释%v[1 -23 3]、[1 -23 3]、&{sdlkjf 23}以默认格式显示的值&#xff0c;与bool&#xff08;%t&#xff09;、int, int8 etc&#xff08;%d&#xff09;、uint, uint8 et…...

Jenkins基于tag的构建

文章目录 Jenkins参数化构建设置设置gitlab tag在工程中维护构建的版本按指定tag的版本启动服务 Jenkins参数化构建设置 选择参数化构建&#xff1a; 在gradle构建之前&#xff0c;增加执行shell的步骤&#xff1a; 把新增的shell框挪到gradle构建之前&#xff0c; 最后保存 …...

性能设计模式

class Singleton { public: static Singleton& getInstance() {static Singleton instance; // 局部静态变量return instance; } private:Singleton() {}Singleton(const Singleton&) delete; // 禁止拷贝Singleton& operator(const Singleton&) delete; // …...

Android 热点分享二维码功能简单介绍

Android 热点分享二维码 文章目录 Android 热点分享二维码一、前言二、热点二维码1、热点分享的字符串2、代码中热点字符串拼接和设置示例3、一个图片示例 三、其他1、Android 热点分享二维码小结2、Android11 设置默认热点名称和热点密码、密码长度 一、前言 比较新的Android…...

SIEM之王,能否克服创新者的窘境?

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…...

(JAVA)浅尝关于 “栈” 数据结构

1. 栈的概述&#xff1a; 1.1 生活中的栈 存储货物或供旅客住宿的地方&#xff0c;可引申为仓库、中转站。例如酒店&#xff0c;在古时候叫客栈&#xff0c;是供旅客休息的地方&#xff0c;旅客可以进客栈休息&#xff0c;休息完毕后就离开客栈 1.2计算机中的栈 将生活中的…...

【前端】ES13:ES13新特性

文章目录 1 类新增特性1.1 私有属性和方法1.2 静态成员的私有属性和方法1.3 静态代码块1.4 使用in来判断某个对象是否拥有某个私有属性 2 支持在最外层写await3 at函数来索引元素4 正则匹配的开始和结束索引5 findLast() 和 findLastIndex() 函数6 Error对象的Cause属性 1 类新…...

vuepress 浏览器加载缓存,总是显示旧页面,无法自动刷新数据的解决方法

vuepress 采用多页面形式&#xff0c;每个md文件在打包时&#xff0c;都会被转为一个html页面&#xff1b;而浏览器默认会缓存页面&#xff0c;导致更新的页面必须手动刷新才行 对于更新较为频繁的文档 全局可在config.js里设置 参考文档: https://vuepress.github.io/zh/ref…...

如何使用代理IP解决反爬虫问题

在网络爬虫的世界里&#xff0c;反爬虫机制就像是守卫城池的士兵&#xff0c;时刻准备着抵御外来的“入侵者”。为了突破这些守卫&#xff0c;代理IP就像是你的隐形斗篷&#xff0c;帮助你在网络世界中自由穿梭。今天&#xff0c;我们就来聊聊如何使用代理IP解决反爬虫问题。 …...

QT学习笔记之绘图

或许有人会等你到天黑&#xff0c;但是你不该在天黑后再找他&#xff08;她&#xff09;。 1.绘图事件 在ui文件中添加一个按钮&#xff0c;同时在资源文件中添加一个名字为1.jpg的图片。 widget.cpp #include "widget.h" #include "ui_widget.h" #incl…...

大数据新视界 --大数据大厂之数据清洗工具 OpenRefine 实战:清理与转换数据

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

基于QT的C++中小项目软件开发架构源码

描述 基于QT信号槽机制实现类之间的交互调用通信&#xff0c;适用于使用不同枚举作为消息交互的类型场景&#xff0c;支持附带任意参数&#xff0c;代码使用方式参考前一篇文章 特性 代码简洁&#xff0c;不超过100行仅需包含一个头文件Communicator.h&#xff0c;需要通信的…...

self-supervised, weakly supervised, and supervised respectively区别

Self-supervised learning&#xff08;自监督学习&#xff09;、weakly supervised learning&#xff08;弱监督学习&#xff09;和supervised learning&#xff08;监督学习&#xff09;是机器学习中的不同学习范式&#xff0c;它们的主要区别如下&#xff1a; 一、监督学习&…...

安卓好软-----手机屏幕自动点击工具 无需root权限

工具可以设置后自动点击屏幕。可以用于一些操作。例如自动刷视频等等哦 工具介绍 一款可以帮你实现自动操作的软件。软件中你可以根据实际需要设置点击位置&#xff0c;可以是屏幕上的特定位置&#xff0c;也可以是按钮或控件。功能非常强大&#xff0c;但是操作非常简单&…...

【Redis】主从复制(下)--主从复制原理和流程

文章目录 主从复制原理主从节点建立复制流程图数据同步 psyncpsync的语法格式 psync运行流程全量复制全量复制的流程全量复制的缺陷有磁盘复制 vs 无磁盘复制 部分复制部分复制的流程复制积压缓冲区 实时复制 主从复制原理 主从节点建立复制流程图 保存主节点的信息从节点(sla…...

Pencils Protocol上线 Vaults 产品,为 $DAPP 深入赋能

Pencils Protocol 是 Scroll 生态一站式综合收益平台&#xff0c;该平台以 DeFi 功能作为抓手&#xff0c;基于 Farming、Vaults、Auction 等功能不断向 LRT、LaunchPad、AI、FHE、RWA 等领域深入的拓展。 近期 Pencils Protocol 生态不断迎来重磅进展&#xff0c;一个是 $DAPP…...

uni-app+vue3+pina实现全局加载中效果,自定义全局变量和函数可供所有页面使用

首先自定义一个加载中组件 ccloading.vue <template><view class"request-loading-view" v-if"loadingShow"><view class"loading-view"><image class"loading-img" :src"loading" mode"aspectF…...

基于SSM+小程序的在线课堂微信管理系统(在线课堂1)(源码+sql脚本+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 &emsp1、管理员实现了首页、个人中心、用户管理、课程分类管理、课程信息管理、课程订阅管理、课程视频管理、公告栏管理、留言板管理、系统管理。 2、用户实现了首页、课程信息、公…...

终极FGO自动化助手:告别枯燥刷本,每天节省3小时游戏时间

终极FGO自动化助手&#xff1a;告别枯燥刷本&#xff0c;每天节省3小时游戏时间 【免费下载链接】FGA Auto-battle app for F/GO Android 项目地址: https://gitcode.com/gh_mirrors/fg/FGA Fate/Grand Automata&#xff08;简称FGA&#xff09;是一款专为Fate/Grand Or…...

从分布式到可分发:大规模软件制品分发架构设计与实践

1. 项目概述&#xff1a;从“分布式”到“可分发”的思维跃迁最近在梳理团队内部的基础设施时&#xff0c;又翻出了distr-sh/distr这个项目。说实话&#xff0c;第一次看到这个仓库名&#xff0c;我下意识地把它归类为又一个“分布式系统”框架。但当我真正点进去&#xff0c;花…...

认识Python数据包套接字

如你所知&#xff0c;数据包格式套接字&#xff08;Datagram Sockets&#xff09;也叫“无连接的套接字”&#xff0c;在代码中使用 SOCK_DGRAM 表示。可以将 SOCK_DGRAM 比喻成高速移动的摩托车快递&#xff0c;它有以下特征&#xff1a;强调快速传输而非传输顺序&#xff1b;…...

AI赋能安全分析:hexstrike-ai项目实战与提示词工程详解

1. 项目概述&#xff1a;一个为安全研究而生的AI助手如果你是一名安全研究员、逆向工程师或者渗透测试人员&#xff0c;那么你肯定对“工具链”这个词深有体会。我们的工作台就像是一个复杂的车间&#xff0c;摆满了IDA Pro、Ghidra、x64dbg、Burp Suite、Wireshark……这些工具…...

LoRA模型合并实战指南:多技能融合与vLLM部署

1. 项目概述&#xff1a;LoRA模型合并的“瑞士军刀”最近在折腾大语言模型微调的朋友&#xff0c;估计对LoRA&#xff08;Low-Rank Adaptation&#xff09;这个词都不陌生。它就像给预训练好的大模型“打补丁”&#xff0c;用极小的参数量&#xff08;通常只有原模型的0.1%到1%…...

基于GEMMA与NeoPixel制作智能可穿戴首饰:从硬件选型到代码实现

1. 项目概述&#xff1a;当微型控制器遇见珠宝设计几年前&#xff0c;当我第一次把一块微控制器塞进一个首饰盒里&#xff0c;看着它驱动一圈LED发出柔和的光晕时&#xff0c;我就知道&#xff0c;电子制作和个性化穿戴的结合&#xff0c;远不止于智能手表或健身手环。我们今天…...

基于AW9523与CircuitPython的互动LED灯带硬件开发实践

1. 项目概述&#xff1a;一个会“动”的LED灯带如果你玩过嵌入式开发&#xff0c;尤其是用Adafruit的板子做点小玩意儿&#xff0c;那你肯定对“快速原型”这个词不陌生。CircuitPython的出现&#xff0c;让写代码控制硬件变得像在电脑上写脚本一样简单。但有时候&#xff0c;板…...

Logseq Full House Templates 终极指南:如何用智能模板提升知识管理效率

Logseq Full House Templates 终极指南&#xff1a;如何用智能模板提升知识管理效率 【免费下载链接】logseq13-full-house-plugin Logseq Templates you will really love ❤️ &#x1f3db;️ 项目地址: https://gitcode.com/gh_mirrors/lo/logseq13-full-house-plugin …...

Spring Kafka监听多个Topic时,如何避免消费者‘摸鱼’?聊聊Range和RoundRobin分配策略的选择

Spring Kafka多Topic监听场景下消费者分配策略深度优化 1. 问题背景&#xff1a;当消费者开始"摸鱼" 在分布式消息系统中&#xff0c;Kafka凭借其高吞吐、低延迟的特性成为众多企业的首选。然而在实际开发中&#xff0c;不少团队遇到过这样的尴尬场景&#xff1a;明明…...

用STM32F103C8T6和HC-05蓝牙模块,从零DIY一辆蓝牙遥控小车(附完整代码与MIT App Inventor教程)

从零打造STM32蓝牙遥控小车&#xff1a;硬件配置到APP开发全指南 项目背景与核心价值 对于嵌入式开发初学者来说&#xff0c;理论知识和实际项目之间往往存在一道难以跨越的鸿沟。而一个完整的硬件项目实践&#xff0c;恰恰是填补这一空白的最佳方式。基于STM32F103C8T6和HC-05…...