Leetcode 200. 岛屿数量

心路历程:
在没有看图论这一章之前看这道题没什么直接的思路,在看完图论之后,学着使用DFS和BFS去套用解决。第一次自己做的时候还是遇到了很多小问题。整体思路很流畅,但是需要处理的细节第一次没怎么处理好,花了很多时间去思考图中的回溯和常规组合/子集回溯问题的区别。
这道题的一个整体思路还是对grid进行遍历,然后标记所有连成一片陆地的点,下次直接跳过。
注意的点:
1、这道题很难用visited=[]然后append的方式去记录访问过的点,只能用visited[i][j]=True这种方式,否则会超时。
2、用DFS时,虽然用的还是回溯的模板,但是由于目的是记录访问过的所有点而不是路径(区域问题而非路径问题),所以不需要恢复现场。
3、用BFS时,如果在出队时记录visited会超时,需要在入队的时候记录visited才行。因为在BFS中队列的长度可能会很长,而且很容易把重复的结点入队。用DFS时,把visited的赋值放在candidate的选择那,也会加快程序的运行,这样就不用在下次收集candicate的时候收集重复的结点了。可以总结为,在visited岛屿问题中,在用到not allvisited[newx][newy]后立刻赋值True。
4、图中的四向问题用dxy = [(0,1), (0,-1), (1,0), (-1,0)]的形式会更清晰简洁。
5、无论是DFS还是BFS,本质在每次处理的都是以i, j为索引的’结点‘。
6、图中的DFS和回溯的唯一区别就是对于visited的维护模式不同,回溯需要pop,图的深搜只要遍历过就下次无论如何也不用考虑了,毕竟搜索的是区域而不是路径。(遍历过的多叉树的路径就保存下来)
解法一:DFS+遍历grid
class Solution:def numIslands(self, grid: List[List[str]]) -> int:# DFS + 循环遍历;回溯求区域而不是路径,因此不需要在回溯函数调用后恢复现场m, n = len(grid), len(grid[0])dxy = [(0,1), (0,-1), (1,0), (-1,0)]def dfs(i,j): # 对i,j区域进行搜索,将联通i,j的陆地全部记录起来。# 获取可选集合candicate = []for dx, dy in dxy:newx, newy = i+dx, j+dyif 0 <= newx <= m-1 and 0 <= newy <= n-1 and grid[newx][newy] == '1' and not allvisited[newx][newy]:candicate.append([newx, newy])allvisited[newx][newy] = True # 在用到not allvisited[newx][newy]后立刻赋值if not candicate:returnfor each in candicate:dfs(each[0], each[1])# visited.pop() # 不用恢复了,因为不是要求路径的总和,而是记录遍历过的路径(路径就是一个grid)allvisited = [[False]*n for _ in range(m)] # 用allvisited += visited的那种做法会超时num = 0for xi in range(m):for yi in range(n):if not allvisited[xi][yi] and grid[xi][yi] == '1':dfs(xi,yi)num += 1return num
解法二:BFS+遍历grid
class Solution:def numIslands(self, grid: List[List[str]]) -> int:# BFS; 没有必要找到每个岛屿的陆地区域,只需要将遍历过的标记上即可;基本图和回溯的任何问题都得记录visited,至少要考虑上一步重复from collections import dequem, n = len(grid), len(grid[0])dxy = [(0,1), (0,-1), (1,0), (-1,0)]visited = [[False]*n for _ in range(m)]num = 0quelen = []for i in range(m):for j in range(n):# 对每个i,j做bfs并标记上搜索过的区域if grid[i][j] == '1' and not visited[i][j]: # 1 和 '1'num += 1que = deque([[i,j]])visited[i][j] = Truewhile que: # 不需要记录层数quelen.append(len(que))x, y = que.popleft()# visited[x][y] = True # 出队放会超时for dx, dy in dxy:newx, newy = x+dx, y+dyif 0 <= newx <= m-1 and 0 <= newy <= n-1 and not visited[newx][newy] and grid[newx][newy] == '1':que.append([newx, newy])visited[newx][newy] = True # 只可以在进队的时候设置visited,出队的时候会超时!return num相关文章:
Leetcode 200. 岛屿数量
心路历程: 在没有看图论这一章之前看这道题没什么直接的思路,在看完图论之后,学着使用DFS和BFS去套用解决。第一次自己做的时候还是遇到了很多小问题。整体思路很流畅,但是需要处理的细节第一次没怎么处理好,花了很多…...
多线程基础 -概念、创建、等待、分离、终止
文章目录 一、 线程概念1. 什么是线程2. 线程的优点3.线程的缺点4. 线程异常5. 线程用途 二、 Linux进程VS线程1. 进程和线程2. 进程和线程的地址空间3. 进程和线程的关系 三、Linux线程控制1. POSIX线程库2. 线程创建3. 线程ID及进程地址空间布局4. 线程终止5. 线程等待6. 线程…...
【Vue3】走进Pinia,学习Pinia,使用Pinia
💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…...
【TB作品】430单片机,单片机串口多功能通信,Proteus仿真
文章目录 题目功能仿真图程序介绍代码、仿真、原理图、PCB 题目 60、单片机串口多功能通信 基本要求: 设计一串口通信程序,波特率38400,通过RS232与PC机通信。 自动循环发送数据串(设计在程序中) 接收并存储和显示该数据串 在发送端定义10个ASCII码键0-9 按键发送单字节,PC机接…...
【C++ leetcode】双指针问题
1. 611. 有效三角形的个数 题目 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 题目链接 . - 力扣(LeetCode) 画图 和 文字 分析 判断是否是三角形要得到三边,由于遍历三边要套三层循环&#x…...
Kubernetes集群部署
1.集群环境搭建 1.1 环境规划 kubernetes集群大体上分为两类:一主多从和多主多从。 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境多主多从:多台Master节点和多…...
深拷贝与浅拷贝
深拷贝与浅拷贝是在进行对象复制时常见的两种方式,这两个概念其实比较混淆,面试中也经常出现,但是实际开发很少用到,所以本文就来详细讲解一下,让大家不再迷惑。 浅拷贝只是复制了对象的引用(地址…...
golang学习网址
.1LearnKu 终身编程者的知识社区 https://learnku.com/...
2024学习鸿蒙开发,未来发展如何?
一、前言 想要了解一个领域的未来发展如何,可以从如下几点进行,避免盲从: 国家政策落地情况就业市场如何学习 通过上述三点,就能分析出一个行业的趋势。大家可以看到,我上面的总体逻辑就是根据国家政策来分析未来方…...
3.21Code
基于二叉链表的二叉树最大宽度的计算 #include<iostream>#define MAXSIZE 1000using namespace std;int k0; int m0; //记录层数 typedef struct BiNode{char data;struct BiNode *lchild;struct BiNode *rchild; }BiNode,*BiTree;void CreateBiTree(BiTree &T){cha…...
学习总结2
解题思路 用bfs进行搜索,标记A罐B罐所保存的水的出现情况,当再次出现的时候停止搜索,然后用数组模拟链表进行保存路径.最后输出. 代码 #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #in…...
【LeetCode】--- 动态规划 集训(一)
目录 一、1137. 第 N 个泰波那契数1.1 题目解析1.2 状态转移方程1.3 解题代码 二、面试题 08.01. 三步问题2.1 题目解析2.2 状态转移方程2.3 解题代码 三、746. 使用最小花费爬楼梯3.1 题目解析3.2 状态转移方程3.3 解题代码 一、1137. 第 N 个泰波那契数 题目地址:…...
【数据结构与算法】(18):树形选择排序:按照锦标赛的思想进行排序
🤡博客主页:Code_文晓 🥰本文专栏:数据结构与算法 😻欢迎关注:感谢大家的点赞评论关注,祝您学有所成! ✨✨💜💛想要学习更多数据结构与算法点击专栏链接查看&…...
统计单词数
统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。 现在,请你编程实现这一功能,具体要求是:给定一个单词࿰…...
c++pair的用法
pair简单来说就是可以存储两种类型数据的一个类,其内部是使用模板实现的,所以可以指定其内部的类型。 pair在#include <utility> pair的构造 pair<int, string> p1({ 1,"张三" });pair<int, string> p2;pair<int, str…...
石油炼化5G智能制造工厂数字孪生可视化平台,推进行业数字化转型
石油炼化5G智能制造工厂数字孪生可视化平台,推进行业数字化转型。在石油炼化行业,5G智能制造工厂数字孪生可视化平台的出现,为行业的数字化转型注入了新的活力。石油炼化行业作为传统工业的重要领域,面临着资源紧张、环境压力、安…...
IP代理技术革新:探索数据采集的新路径
引言: 随着全球化进程不断加深,网络数据采集在企业决策和市场分析中扮演着愈发重要的角色。然而,地域限制和IP封锁等问题常常给数据采集工作带来了巨大挑战。亿牛云代理服务凭借其强大的网络覆盖和真实住宅IP资源,成为解决这些问…...
流畅的 Python 第二版(GPT 重译)(一)
前言 计划是这样的:当有人使用你不理解的特性时,直接开枪打死他们。这比学习新东西要容易得多,不久之后,活下来的程序员只会用一个容易理解的、微小的 Python 0.9.6 子集来编写代码 。 Tim Peters,传奇的核心开发者&am…...
Vue+jquery+jquery.maphilight实现图片热区高亮以及点击效果
//鼠标悬浮效果 mounted() {this.setCurrentTask(0); //对于id为mapAll的热区图,设置鼠标放置在上面有一个颜色 fillColor填充颜色 strokeColor边框颜色 strokeWidth边框宽度 fillOpacity 是设置热区填充颜色的不透明度的属性。 alwaysOn:true 保持常量$(function(…...
靠谱!朋友圈一键转发和自动转发好友朋友圈
微信朋友圈在生活和工作中扮演着重要的社交和信息传播角色。尤其是对于一些企业来说,朋友圈是不可或缺的推广渠道。 今天就给大家分享一个能够实现一键转发和自动转发好友朋友圈的工具——微信管理系统,让大家都能有效的管理朋友圈。 1、定时发圈&…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
