【力扣hot100】刷题笔记Day15

前言

  • 今天要刷的是图论,还没学过,先看看《代码随想录》这部分的基础

深搜DFS理论基础

  • 深搜三部曲

    • 确认递归函数、参数
    • 确认终止条件
    • 处理目前搜索节点出发的路径
  • 代码框架

    • void dfs(参数) {if (终止条件) {存放结果;return;}for (选择:本节点所连接的其他节点) {处理节点;dfs(图,选择的节点); // 递归回溯,撤销处理结果}
      }
      

797. 所有可能的路径 - 力扣(LeetCode)

  • DFS

    • class Solution:def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:res = []   # 存放结果path = [0]  # 当前路径def dfs(root: int):if root == len(graph) - 1:  # 如果到达最后节点存入结果,res.append(path[:])  # path[:]避免使用引用,deep copyreturnfor node in graph[root]:  # 遍历root所有节点path.append(node)     # path加上当前遍历节点dfs(node)             # 下一层继续搜索path.pop()            # 回溯,撤销节点dfs(0)return res
      

广搜BFS理论基础

  • 适用于解决两个点之间的最短路径问题
  • from collections import deque
    dir = [(0, 1), (1, 0), (-1, 0), (0, -1)] # 创建方向元素def bfs(grid, visited, x, y):queue = deque() # 初始化队列queue.append((x, y)) # 放入第一个元素/起点visited[x][y] = True # 标记为访问过的节点while queue: # 遍历队列里的元素curx, cury = queue.popleft() # 取出第一个元素for dx, dy in dir: # 遍历四个方向nextx, nexty = curx + dx, cury + dyif nextx < 0 or nextx >= len(grid) or nexty < 0 or nexty >= len(grid[0]): continue  # 越界了,直接跳过if not visited[nextx][nexty]: # 如果节点没被访问过  queue.append((nextx, nexty)) # 加入队列visited[nextx][nexty] = True # 标记为访问过的节点

 200. 岛屿数量 - 力扣(LeetCode)

  • DFS

    • class Solution:def numIslands(self, grid: List[List[str]]) -> int:m, n = len(grid), len(grid[0])# visited = [[False] * n for _ in range(m)]  # 如果不能修改用标记grid# 深搜当前陆地部分def dfs(x, y):  # x表示行,y表示列grid[x][y] = "0"  # 遍历到的节点就置为0以防重复,用visited则删除此句for nx, ny in [(x-1,y), (x+1,y), (x,y-1), (x,y+1)]:if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] == "1":# if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] == "1" and not visited[nx][ny]:# visited[nx][ny] = Truedfs(nx,ny)# 依次遍历每个节点搜索大陆res = 0for i in range(m):for j in range(n):if grid[i][j] == "1":# if not visited[i][j] and grid[i][j] == '1':# visited[i][j] = Trueres += 1  # 遇到没访问过的陆地,+1dfs(i, j)# 返回总陆地数return res
  •  BFS

    • class Solution:def numIslands(self, grid: List[List[str]]) -> int:m, n = len(grid), len(grid[0])# visited = [[False] * n for _ in range(m)]  # 如果不能修改用visited标记grid中已访问节点# 广搜当前陆地部分def bfs(x, y):  # x表示行,y表示列q = deque()q.append((x,y))grid[x][y] = "0"  # 遍历到的节点就置为0以防重复,用visited则删除此句# visited[x][y] = True  # 用visitedwhile q:x0, y0 = q.popleft()  # 当前遍历节点加入队列for nx, ny in [(x0-1,y0), (x0+1,y0), (x0,y0-1), (x0,y0+1)]:if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] == "1":   # 用visited则删除此句# if 0 <= nx < m and 0 <= ny < n and grid[nx][ny] == "1" and not visited[nx][ny]:q.append((nx, ny))grid[nx][ny] = "0"  # 加入列表就标记为访问过,用visited则删除此句# visited[nx][ny] = True  # 用visited                        # 依次遍历每个节点搜索大陆res = 0for i in range(m):for j in range(n):if grid[i][j] == "1":# if not visited[i][j] and grid[i][j] == '1':res += 1  # 遇到没访问过的陆地,+1bfs(i, j)# 返回总陆地数return res
  • 并查集 

    • 没接触过并查集,依据这道题在B站大学找了相关视频和文章学习一下
    • ## 解法三:UnionFind 并查集经典解法
      class UnionFind: ## 定义为一个类。后面类似的题目,也可以直接搬去使用def __init__(self, grid): ## 初始化m, n = len(grid), len(grid[0])self.count = 0 ## count 是最终结果,初始化为0self.parent = [-1] * (m * n)  ## 初始化 parent 数组取值全部为 -1## rank 秩,表示树的高度,在连接的时候要规定秩小的指向秩大的元素self.rank = [0] * (m * n) ## rank 用来实现上下左右的合并;初始化全部为 0 ## 计算陆地的总数 count;修改 parent 数组陆地元素的取值for i in range(m):for j in range(n):if grid[i][j] == "1": ## 对于陆地元素,把它的parent初始化为它的一维化的位置self.parent[i * n + j] = i * n + j ## parent初始化为元素本身的一维化的(位置)索引self.count += 1  ## 陆地总数## find 方法给union 方法调用def find(self, i):if self.parent[i] != i: ## 对于索引不等于自身的元素self.parent[i] = self.find(self.parent[i]) ## 路径优化。把所有链式关系,简化为一层的父子关系return self.parent[i] ## 返回父亲的索引(也等于该索引对应的取值)## 最关键是 union 方法,用来处理目标元素并计算岛屿数量def union(self, x, y):rootx = self.find(x) ## 找到自己的 root 索引rooty = self.find(y) ## 找到自己的 root 索引if rootx != rooty:  ## 如果不等,则进行合并if self.rank[rootx] <= self.rank[rooty]: ## 如果 rank 更小self.parent[rootx] = rooty  ## 秩小的指向秩大的元素else:self.parent[rooty] = rootx  ## 秩小的指向秩大的元素if self.rank[rootx] == self.rank[rooty]: ## 如果秩相等self.rank[rootx] += 1 ## 如果深度相同,新节点的 rank + 1self.count -= 1 ## 合并一次,则陆地数量减一(岛屿数量=陆地数量-总的合并次数)## 主类 + 主函数
      class Solution:def numIslands(self, grid: List[List[str]]) -> int: ## 主函数nr = len(grid) ## number of rowif nr == 0:return 0nc = len(grid[0]) ## number of columnuf = UnionFind(grid) ## 调用并查集函数## 遍历每一个位置for r in range(nr):for c in range(nc):if grid[r][c] == "1": ## 碰到陆地 1grid[r][c] = "0"  ## 先修改为 0for x, y in [(r - 1, c), (r + 1, c), (r, c - 1), (r, c + 1)]: ## 遍历上下左右if 0 <= x < nr and 0 <= y < nc and grid[x][y] == "1": ## 碰到新的 1uf.union(r * nc + c, x * nc + y) ## 调用并查集函数return uf.count

后言

  • 并查集这个学得我好累,这就是缺乏基础吧,路漫漫啊 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Git教程-Git的基本使用

Git是一个强大的分布式版本控制系统&#xff0c;它不仅用于跟踪代码的变化&#xff0c;还能够协调多个开发者之间的工作。在软件开发过程中&#xff0c;Git被广泛应用于协作开发、版本管理和代码追踪等方面。以下是一个详细的Git教程&#xff0c;我们将深入探讨Git的基本概念和…

npm ERR! code ERESOLVE

1、问题概述&#xff1f; 执行npm install命令的时候报错如下&#xff1a; tangxiaochuntangxiaochundeMacBook-Pro stf % npm install npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resol…

C++ Primer 总结索引 | 第八章:IO库

1、IO类 1、已经使用过的IO类型和对象 都是 操纵char数据的。默认情况下&#xff0c;这些对象 都是关联到 用户的控制台窗口的 但是 不能仅从控制台窗口 进行IO操作&#xff0c;应用程序 需要 读写命名文件&#xff0c;使用IO操作 处理string中的字符 会很方便&#xff0c;此…

Netty入门指南:从零开始的异步网络通信

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Netty入门指南&#xff1a;从零开始的异步网络通信 前言Netty简介由来&#xff1a;发展历程&#xff1a;异步、事件驱动的编程模型&#xff1a; 核心组件解析通信协议高性能特性异步编程范式性能优化与…

Linux零基础快速入门

Linux的诞生 Linux创始人:林纳斯 托瓦兹 Linux 诞生于1991年&#xff0c;作者上大学期间 因为创始人在上大学期间经常需要浏览新闻和处理邮件&#xff0c;发现现有的操作系统不好用,于是他决心自己写一个保护模式下的操作系统&#xff0c;这就是Linux的原型&#xff0c;当时他…

【MySQL】DCL

DCL英文全称是Data Control Language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 1. 管理用户 在MySQL数据库中&#xff0c;DCL&#xff08;数据控制语言&#xff09;是用来管理用户和权限的语句集合。通过DCL语句&#xff0c;可以创建、修改、删…

leetcode 重复的子字符串

前要推理 以abababab为例&#xff0c;这里最主要的就是根据相等前后缀进行推导 s [ 0123 ] 如 t【 0123 】 f 【01 23 】 后两个分别是前后缀&#xff0c;第一个是总的字符串&#xff0c;然后可以推导 //首先还是算出…

Spring的定时任务不生效、不触发,一些可能的原因,和具体的解决方法。

1 . 未在启动类上加 EnableScheduling 注解 原因&#xff1a;未在Spring Boot应用主类上添加EnableScheduling注解或未在XML配置文件中配置定时任务的启用。解决方法&#xff1a;确保在应用的配置类上添加EnableScheduling注解&#xff0c;启用定时任务。 2 . cron 表达式书写…

P4859 已经没有什么好害怕的了(二项式反演+dp)

题录&#xff1a;P4859 已经没有什么好害怕的了 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路: 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> #include<cstring> #include<cmath> #include<ctim…

Kubernetes剖析

Kubernetes剖析 前言 ​ 容器技术这样一个新生事物&#xff0c;完全重塑了整个云计算市场的形态。它不仅催生出了一批年轻有为的容器技术人&#xff0c;更培育出了一个具有相当规模的开源基础设施技术市场。 ​ 在这个市场里&#xff0c;不仅有 Google、Microsoft 等技术巨擘…

【GPTs分享】GPTs分享之Photo Multiverse,不唱、跳、RAP的坤坤能叫坤坤吗

今日GPTs分享&#xff1a;Photo Multiverse。Photo Multiverse 是一款基于先进人工智能技术的创意辅助工具&#xff0c;专为艺术家和创意人士设计&#xff0c;以探索和创造多元宇宙中的视觉艺术。它通过结合古老的艺术神秘主义和现代技术&#xff0c;帮助用户将他们的想象力变为…

linux gdb 调试工具

1.写程序 首先&#xff0c;我们先写出一个 .c 或者.cpp程序 如 然后 gcc -g hello.c -o hello 或者 g -g hello.cpp -o hello &#xff08;-g&#xff09;要加 2. gdb调试 用 gdb &#xff08;可执行程序&#xff0c;如hello&#xff09; 进入之后&#xff0c;有…

el-table 多选表格存在分页,编辑再次操作勾选会丢失原来选中的数据

el-table表格多选时&#xff0c;只需要添加type"selection"&#xff0c; row-key及selection-change&#xff0c;如果存在分页时需要加上reserve-selection&#xff0c;这里就不写具体的实现方法了&#xff0c;可以查看我之前的文章&#xff0c;这篇文章主要说一下存…

算法打卡day5|哈希表篇01|Leetcode 242.有效的字母异位词 、19.删除链表的倒数第N个节点、202. 快乐数、1. 两数之和

哈希表基础知识 哈希表 哈希表关键码就是数组的索引下标&#xff0c;然后通过下标直接访问数组中的元素&#xff1b;数组就是哈希表的一种 一般哈希表都是用来快速判断一个元素是否出现集合里。例如要查询一个名字是否在班级里&#xff1a; 要枚举的话时间复杂度是O(n)&…

Linux服务器中文乱码如何解决

如果服务器上数字和英文均可正常展示&#xff0c;只有中文是奇奇怪怪的乱码&#xff0c;那么可以考虑是服务器本身字体输出有问题。 如何在服务器上安装中文宋体字体库呢&#xff0c;排查及安装字体库步骤如下&#xff1a; 使用 fc-list命令检查服务器是否安装字体库如果提示…

Docker部署Portainer图形化管理工具

文章目录 前言1. 部署Portainer2. 本地访问Portainer3. Linux 安装cpolar4. 配置Portainer 公网访问地址5. 公网远程访问Portainer6. 固定Portainer公网地址 前言 Portainer 是一个轻量级的容器管理工具&#xff0c;可以通过 Web 界面对 Docker 容器进行管理和监控。它提供了可…

模仿蜘蛛工作原理 苏黎世联邦理工学院研发牛油果机器人可在雨林树冠穿行

对于野外环境生物监测的研究人员来讲&#xff0c;收集生物多样性数据已成为日常工作重要组成部分&#xff0c;特别是对于热带雨林的茂密树冠当中活跃着非常多的动物、昆虫与植物。每次勘察都需要研究人员爬上茂密树冠收集数据&#xff0c;一方面增加了数据收集难度&#xff0c;…

性能测试-反编译jar

方法一&#xff0c;使用jd-gui 1、官网下载&#xff1a;Java Decompiler 2、下载mac版本后&#xff0c;解压&#xff0c;如下所示&#xff1a; 双击 JD_GUI&#xff0c;提示错误&#xff0c;如下所示&#xff1a; 已经安装了java 17&#xff0c;是java 1.8以上版本&#xff0…

milvus upsert流程源码分析

milvus版本:v2.3.2 整体架构: Upsert 的数据流向: 1.客户端sdk发出Upsert API请求。 import numpy as np from pymilvus import (connections,Collection, )num_entities, dim 4, 3print("start connecting to Milvus") connections.connect("default",…

程序员年龄增大后的职业出路是什么?

​新年刚过&#xff0c;返工在即。程序员们都收到大大小小的开门红&#xff0c;开启今年新征程。但是有人欢喜有人忧…… 本想着2024年Android行业会好过一些&#xff0c;还是避免不了裁员风险。在安卓历经了10多年的发展后&#xff0c;因为头部公司的稳定和相互的竞争情况下&a…