图论(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,如果二维数组中存在一个环,处于环上的值都是相同的。返回true;如果不存在就返回false; 思路: 在以往的dfs搜索中,都是往四个方向去dfs;但是在这一道…...
如何在Windows上安装Docker
在 Windows 上使用 Docker 有两种主要方式:通过 Docker Desktop 安装并使用 WSL 2 作为后端,或者直接在 WSL 2 中安装 Docker。这里推荐手残党直接用图形界面安装到WSL 2的后端: 一、启用Hyper-V和容器特性 1. 右键Windows点击应用和功能 …...
golang格式化输入输出
fmt包使用类似于C的printf和scanf的函数实现格式化I/O 1输出格式化 一般的: 动词效果解释%v[1 -23 3]、[1 -23 3]、&{sdlkjf 23}以默认格式显示的值,与bool(%t)、int, int8 etc(%d)、uint, uint8 et…...
Jenkins基于tag的构建
文章目录 Jenkins参数化构建设置设置gitlab tag在工程中维护构建的版本按指定tag的版本启动服务 Jenkins参数化构建设置 选择参数化构建: 在gradle构建之前,增加执行shell的步骤: 把新增的shell框挪到gradle构建之前, 最后保存 …...
性能设计模式
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. 栈的概述: 1.1 生活中的栈 存储货物或供旅客住宿的地方,可引申为仓库、中转站。例如酒店,在古时候叫客栈,是供旅客休息的地方,旅客可以进客栈休息,休息完毕后就离开客栈 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 采用多页面形式,每个md文件在打包时,都会被转为一个html页面;而浏览器默认会缓存页面,导致更新的页面必须手动刷新才行 对于更新较为频繁的文档 全局可在config.js里设置 参考文档: https://vuepress.github.io/zh/ref…...
如何使用代理IP解决反爬虫问题
在网络爬虫的世界里,反爬虫机制就像是守卫城池的士兵,时刻准备着抵御外来的“入侵者”。为了突破这些守卫,代理IP就像是你的隐形斗篷,帮助你在网络世界中自由穿梭。今天,我们就来聊聊如何使用代理IP解决反爬虫问题。 …...
QT学习笔记之绘图
或许有人会等你到天黑,但是你不该在天黑后再找他(她)。 1.绘图事件 在ui文件中添加一个按钮,同时在资源文件中添加一个名字为1.jpg的图片。 widget.cpp #include "widget.h" #include "ui_widget.h" #incl…...
大数据新视界 --大数据大厂之数据清洗工具 OpenRefine 实战:清理与转换数据
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
基于QT的C++中小项目软件开发架构源码
描述 基于QT信号槽机制实现类之间的交互调用通信,适用于使用不同枚举作为消息交互的类型场景,支持附带任意参数,代码使用方式参考前一篇文章 特性 代码简洁,不超过100行仅需包含一个头文件Communicator.h,需要通信的…...
self-supervised, weakly supervised, and supervised respectively区别
Self-supervised learning(自监督学习)、weakly supervised learning(弱监督学习)和supervised learning(监督学习)是机器学习中的不同学习范式,它们的主要区别如下: 一、监督学习&…...
安卓好软-----手机屏幕自动点击工具 无需root权限
工具可以设置后自动点击屏幕。可以用于一些操作。例如自动刷视频等等哦 工具介绍 一款可以帮你实现自动操作的软件。软件中你可以根据实际需要设置点击位置,可以是屏幕上的特定位置,也可以是按钮或控件。功能非常强大,但是操作非常简单&…...
【Redis】主从复制(下)--主从复制原理和流程
文章目录 主从复制原理主从节点建立复制流程图数据同步 psyncpsync的语法格式 psync运行流程全量复制全量复制的流程全量复制的缺陷有磁盘复制 vs 无磁盘复制 部分复制部分复制的流程复制积压缓冲区 实时复制 主从复制原理 主从节点建立复制流程图 保存主节点的信息从节点(sla…...
Pencils Protocol上线 Vaults 产品,为 $DAPP 深入赋能
Pencils Protocol 是 Scroll 生态一站式综合收益平台,该平台以 DeFi 功能作为抓手,基于 Farming、Vaults、Auction 等功能不断向 LRT、LaunchPad、AI、FHE、RWA 等领域深入的拓展。 近期 Pencils Protocol 生态不断迎来重磅进展,一个是 $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脚本+视频导入教程+文档)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 &emsp1、管理员实现了首页、个人中心、用户管理、课程分类管理、课程信息管理、课程订阅管理、课程视频管理、公告栏管理、留言板管理、系统管理。 2、用户实现了首页、课程信息、公…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
