图论| 827. 最大人工岛 127. 单词接龙

827. 最大人工岛

题目:给你一个大小为 n x n 二进制矩阵 grid 。最多 只能将一格 0 变成 1 。返回执行此操作后,grid 中最大的岛屿面积是多少?
岛屿 由一组上、下、左、右四个方向相连的 1 形成。
题目链接:[827. 最大人工岛](https://leetcode.cn/problems/making-a-large-island/)
解题思路:暴力解法 把每一个0改为1计算岛屿面积 复杂度:改每一个0为1:n2计算岛屿最大面积n2 会超时
优化思路:遍历记录所有岛屿面积 将0附近(上下左右)的岛屿进行联通
1.遍历记录所有岛屿面积
如何记录:遍历过的岛屿标记岛屿编号(从2开始) 将岛屿编号和最大面积记录在set中
2. 将0附近(上下左右)的岛屿进行联通
如何判断0周围的面积:遍历0周围的岛屿面积进行联通,将周围的岛屿加入set以防重复叠加
代码如下:

class Solution {public int[][] mark;public int[][] move={{0,1},{0,-1},{1,0},{-1,0}};public HashMap<Integer, Integer> island = new HashMap<Integer, Integer>();public int largestIsland(int[][] grid) {//遍历岛屿并记录int maxArea=0;int masknum=2;mark=new int[grid.length][grid[0].length];for(int i=0;i<grid.length;i++){for(int j=0;j<grid[0].length;j++){if(mark[i][j]==0&&grid[i][j]==1){bfs(grid,i,j,masknum);masknum++;}}}for(int value: island.values()) {if(value>maxArea){maxArea=value;}}//修改岛屿并记录面积for(int i=0;i<grid.length;i++){for(int j=0;j<grid[0].length;j++){if(grid[i][j]==0){HashSet<Integer> sites = new HashSet<>();for(int p=0;p<4;p++){int nextx=i+move[p][0];int nexty=j+move[p][1];if(nextx<0||nextx>=grid.length||nexty<0||nexty>=grid.length){continue;}if(mark[nextx][nexty]!=0){sites.add(mark[nextx][nexty]);}}//计算面积int area=1;for(int p:sites){area+=island.get(p);}if(area>maxArea){maxArea=area;}}}}return maxArea;}public void bfs(int[][] grid,int i,int j,int masknum){int area=1;Queue<int[]> queue=new LinkedList<>();queue.offer(new int[]{i,j});mark[i][j]=masknum;while(!queue.isEmpty()){int[] node=queue.poll();for(int p=0;p<4;p++){int nextx=node[0]+move[p][0];int nexty=node[1]+move[p][1];if(nextx<0||nextx>=grid.length||nexty<0||nexty>=grid.length){continue;}if(mark[nextx][nexty]==0&&grid[nextx][nexty]==1){queue.offer(new int[]{nextx,nexty});mark[nextx][nexty]=masknum;area++;}}}island.put(masknum,area);}
}

217 单词接龙

题目:字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> … -> sk:
每一对相邻的单词只差一个字母。
对于 1 <= i <= k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。
sk == endWord
给你两个单词 beginWord 和 endWord 和一个字典 wordList ,返回 从 beginWord 到 endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0 。
题目链接:217 单词接龙
在这里插入图片描述

解题思路:
为了保证从 beginWord 到 endWord 的转换序列是最短路径,我们使用广度优先搜索(BFS)算法。BFS 有一个重要特性:它首先访问距离源点(在这个场景中是 beginWord)最近的节点。因此,当我们首次到达 endWord 时,我们可以确信找到的路径是最短的。
我们使用队列进行广度优先搜索 每次从队列中取出一个单词,查找与其相差一个字母的所有单词,并将这些单词加入队列 为了防止重复处理相同的单词,我们需要从 wordList 中移除已经处理过的单词。具体是将其与对应路径长度加入map中
代码如下

class Solution {public int ladderLength(String beginWord, String endWord, List<String> wordList) {if (!wordList.contains(endWord)) {return 0;}if (!wordList.contains(beginWord)) {wordList.add(beginWord);}HashSet<String> wordSet = new HashSet<>(wordList);Queue<String> queue = new LinkedList<>();queue.offer(beginWord);Map<String, Integer> visited = new HashMap<>();visited.put(beginWord, 1);while (!queue.isEmpty()) {String currentWord = queue.poll();int currentLength = visited.get(currentWord);for (String word : wordSet) {if (isOneLetterDiff(currentWord, word)) {if (word.equals(endWord)) {return currentLength + 1;}if (!visited.containsKey(word)) {queue.offer(word);visited.put(word, currentLength + 1);}}}}return 0;}private boolean isOneLetterDiff(String word1, String word2) {if (word1.length() != word2.length()) {return false;}int diffCount = 0;for (int i = 0; i < word1.length(); i++) {if (word1.charAt(i) != word2.charAt(i)) {diffCount++;if (diffCount > 1) {return false;}}}return diffCount == 1;}
}

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

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

相关文章

obsidian和bookmaster

1 手动安装插件 插件地址&#xff1a;https://forum-zh.obsidian.md/t/topic/12333 安装file服务器 地址&#xff1a;http://www.rejetto.com/hfs/ hfs.exe可以改个端口 改成8866&#xff0c;ip地址也可以改成 127.0.0.1 # 因为安装到本地 如果要创建账户的话&#xff0c;就…

wpf devexpress在未束缚模式中生成Tree

TreeListControl 可以在未束缚模式中没有数据源时操作&#xff0c;这个教程示范如何在没有数据源时创建tree 在XAML生成tree 创建ProjectObject类实现数据对象显示在TreeListControl: public class ProjectObject {public string Name { get; set; }public string Executor {…

Kubernetes基础知识了解

一、Kubernetes简介 Kubernetes是一个轻便的和可扩展的开源平台&#xff0c;用于管理容器化应用和服务。通过Kubernetes能够进行应用的自动化部署和扩缩容。在Kubernetes中&#xff0c;会将组成应用的容器组合成一个逻辑单元以更易管理和发现。Kubernetes积累了作为Google生产…

微服务架构之路7,Nacos配置中心的Pull原理,附源码

目录 一、本地配置二、配置中心1、以Nacos为例&#xff1a;2、Pull模式3、也可以通过Nacos实现注册中心 三、配置中心提供了哪些功能四、如何操作配置中心1、配置注册2、配置反注册3、配置查看4、配置变更订阅 五、主流的微服务注册中心有哪些&#xff0c;如何选择&#xff1f;…

Echarts 实现两两柱图重叠(背景和实际值柱图)

Echarts实现两两重叠柱状图_echarts 重叠柱状图_Web_阿凯的博客-CSDN博客 引用启发的博客 先来效果&#xff1a; option {backgroundColor: #03213D,animation: true, // 控制动画是否开启animationDuration: 1000, // 动画的时长, 它是以毫秒为单位animationDuration: func…

(免费领源码)基于Vue+Node.js的宠物领养网站的设计与开发83352-计算机毕业设计项目选题推荐

摘 要 随着互联网大趋势的到来&#xff0c;社会的方方面面&#xff0c;各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去&#xff0c;而其中最好的方式就是建立网络管理系统&#xff0c;并对其进行信息管理。由于现在网络的发达&#xff0c;宠物领养网站的…

滚雪球学Java(09-2):Java中的关系运算符,你真的掌握了吗?

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

Minio - 多节点多驱动器安装部署

先决条件 网络互通 MinIO集群中的节点的网络需要互相双向互通。 MinIO API默认端口9000 MinIO console默认端口9001 MinIO强烈建议使用负载均衡器来管理与集群的连接。负载均衡器策略使用“最小连接数”逻辑&#xff0c;因为在部署中任何 MinIO 节点都可以接收、路由或处理…

ERR_PNPM_INVALID_WORKSPACE_CONFIGURATION packages field missing or empty

vue执行 pnpm install命令时&#xff0c;报 ERR_PNPM_INVALID_WORKSPACE_CONFIGURATION  packages field missing or empty错&#xff0c;在网上查询了很久&#xff0c;也没有传出来结果&#xff0c;最后发现是pnpm的版本不对引起的。 我先执行的是npm install -g pnpm&…

delphi电子处方流转 sm2 sm4(药店)

【delphi电子处方流转(药店)】支持 处方下载、处方核验、处方审核、药品销售出库明细上传、药品销售出库明细撤销等功能。技术交流Q 648437169 下载链接&#xff1a;https://download.csdn.net/download/liushenglin123/88543771

cookie机制

目录 为什么会有cookie?? cookie从哪里来的&#xff1f;&#xff1f; cookie到哪里去&#xff1f;&#xff1f; cookie有啥用&#xff1f;&#xff1f; session HttpServletRequest类中的相关方法 简单的实现cookie登录功能 实现登录页面 实现servlet逻辑 实现生成主…

广州华锐互动:办税服务厅税务登记VR仿真体验让税务办理更加灵活高效

在数字化世界的今天&#xff0c;我们正在见证各种业务过程的转型&#xff0c;而税务办理也不例外。最近&#xff0c;一种全新的交互方式正在改变我们处理税务的方式&#xff1a;虚拟现实&#xff08;VR&#xff09;。 首先&#xff0c;用户需要戴上虚拟现实头显&#xff0c;然后…