代码随想录算法训练营Day 63| 图论 part03 | 417.太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙

news2024/9/28 19:21:07

代码随想录算法训练营Day 63| 图论 part03 | 417.太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙


文章目录

  • 代码随想录算法训练营Day 63| 图论 part03 | 417.太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙
  • 17.太平洋大西洋水流问题
    • 一、DFS
    • 二、BFS
    • 三、本题总结
  • 827.最大人工岛
    • 一、DFS 用全局变量得到area
    • 二、DFS 用局部变量
    • 三、BFS
  • 127. 单词接龙
    • 一、BFS


17.太平洋大西洋水流问题

题目链接

一、DFS

class Solution(object):
    def pacificAtlantic(self, heights):
        """
        :type heights: List[List[int]]
        :rtype: List[List[int]]
        """
        m,n=len(heights),len(heights[0])
        dirs = [(-1,0),(0,1),(1,0),(0,-1)]
        pacific=[[0]*n for _ in range(m)]
        atlantic=[[0]*n for _ in range(m)]
        result=[] 
        # DFS
        def dfs(x,y,ocean):
            ocean[x][y]=1
            for d in dirs:
                nextx,nexty=x+d[0],y+d[1]
                if 0 <= nextx < m and 0 <= nexty < n  and heights[nextx][nexty] >=heights[x][y] and ocean[nextx][nexty]==0:
                    dfs(nextx,nexty,ocean)

        for i in range(m):
            dfs(i,0,pacific)
            dfs(i,n-1,atlantic)
        for j in range(n):
            dfs(0,j,pacific)
            dfs(m-1,j,atlantic)
        for i in range(m):
            for j in range(n):
                if pacific[i][j]==1 and atlantic[i][j]==1:
                    result.append([i,j])
        return result
       

二、BFS

class Solution(object):
    def pacificAtlantic(self, heights):
        """
        :type heights: List[List[int]]
        :rtype: List[List[int]]
        """
        m,n=len(heights),len(heights[0])
        dirs = [(-1,0),(0,1),(1,0),(0,-1)]
        pacific=[[0]*n for _ in range(m)]
        atlantic=[[0]*n for _ in range(m)]
        result=[] 
        # BFS
        def bfs(x,y,ocean):
            q=collections.deque()
            q.append((x,y))
            ocean[x][y]=1
            while q:
                x,y = q.popleft()
                for d in dirs:
                    nextx,nexty=x+d[0],y+d[1]
                    if 0 <= nextx < m and 0 <= nexty < n  and heights[nextx][nexty] >=heights[x][y] and ocean[nextx][nexty]==0:
                        ocean[nextx][nexty]=1
                        q.append((nextx,nexty))

        for i in range(m):
            bfs(i,0,pacific)
            bfs(i,n-1,atlantic)
        for j in range(n):
            bfs(0,j,pacific)
            bfs(m-1,j,atlantic)
        for i in range(m):
            for j in range(n):
                if pacific[i][j]==1 and atlantic[i][j]==1:
                    result.append([i,j])
        return result

三、本题总结

用两个visited来表示


827.最大人工岛

题目链接

一、DFS 用全局变量得到area

class Solution(object):
    def largestIsland(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        '''
        总体思路
		利用 DFS 计算出各个岛屿的面积,并标记每个 1(陆地格子)属于哪个岛。
		遍历每个 0,统计其上下左右四个相邻格子所属岛屿的编号,去重后,累加这些岛的面积,更新答案的最大值。
        '''
        m,n = len(grid),len(grid[0])
        dirs = [(-1,0),(0,1),(1,0),(0,-1)]
        area = collections.defaultdict(int) # 用于储存岛屿面积
        def dfs(x,y,island_num): # 输入岛屿编号
            grid[x][y]=island_num 
            area[island_num] += 1 # 更新岛屿面积
            for d in dirs:
                nextx,nexty=x+d[0],y+d[1]
                if 0 <= nextx < m and 0 <= nexty < n  and grid[nextx][nexty]==1:
                    grid[nextx][nexty]=island_num
                    dfs(nextx,nexty,island_num)
        island_num = 1 
        for i in range(m):
            for j in range(n):
                if grid[i][j]==1: # 遇到新岛屿
                    island_num += 1 # 岛屿编号从2开始
                    dfs(i,j,island_num) 
        ans=0
        for i in range(m):
            for j in range(n):
                s=set() # 去重
                if grid[i][j]==0:
                    for d in dirs:
                        nexti,nextj=i+d[0],j+d[1]
                        if 0 <= nexti < m and 0 <= nextj < n  and grid[nexti][nextj]!=0:
                            s.add(grid[nexti][nextj])
                    ans = max(ans,1+sum(area[idx] for idx in s))

        return ans if ans else n*n # 如果最后 ans 仍然为 0,说明所有格子都是 1,返回 n^2

二、DFS 用局部变量

class Solution(object):
    def largestIsland(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        '''
        总体思路
利用 DFS 计算出各个岛屿的面积,并标记每个 1(陆地格子)属于哪个岛。
遍历每个 0,统计其上下左右四个相邻格子所属岛屿的编号,去重后,累加这些岛的面积,更新答案的最大值。
        '''
        m,n = len(grid),len(grid[0])
        dirs = [(-1,0),(0,1),(1,0),(0,-1)]
        area = collections.defaultdict(int) # 用于储存岛屿面积
        def dfs(x,y,island_num): # 输入岛屿编号
            grid[x][y]=island_num 
            size=1
            # area[island_num] += 1 # 更新岛屿面积
            for d in dirs:
                nextx,nexty=x+d[0],y+d[1]
                if 0 <= nextx < m and 0 <= nexty < n  and grid[nextx][nexty]==1:
                    grid[nextx][nexty]=island_num
                    size += dfs(nextx,nexty,island_num)
            return size # 得到岛屿的面积
        island_num = 1 
        for i in range(m):
            for j in range(n):
                if grid[i][j]==1: # 遇到新岛屿
                    island_num += 1 # 岛屿编号从2开始
                    area[island_num]=dfs(i,j,island_num) 
        ans=0
        for i in range(m):
            for j in range(n):
                s=set() # 去重
                if grid[i][j]==0:
                    for d in dirs:
                        nexti,nextj=i+d[0],j+d[1]
                        if 0 <= nexti < m and 0 <= nextj < n  and grid[nexti][nextj]!=0:
                            s.add(grid[nexti][nextj])
                    ans = max(ans,1+sum(area[idx] for idx in s))

        return ans if ans else n*n # 如果最后 ans 仍然为 0,说明所有格子都是 1,返回 n^2

三、BFS

class Solution(object):
    def largestIsland(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        '''
        总体思路
利用 DFS 计算出各个岛屿的面积,并标记每个 1(陆地格子)属于哪个岛。
遍历每个 0,统计其上下左右四个相邻格子所属岛屿的编号,去重后,累加这些岛的面积,更新答案的最大值。
        '''
        # BFS
        def bfs(x,y,island_num): # 输入岛屿编号
            grid[x][y]=island_num 
            size=1
            # area[island_num] += 1 # 更新岛屿面积
            q=collections.deque()
            q.append((x,y))
            while q:
                x,y=q.popleft()
                for d in dirs:
                    nextx,nexty=x+d[0],y+d[1]
                    if 0 <= nextx < m and 0 <= nexty < n  and grid[nextx][nexty]==1:
                        grid[nextx][nexty]=island_num
                        q.append((nextx,nexty))
                        size += 1
            return size
            
        island_num = 1 
        for i in range(m):
            for j in range(n):
                if grid[i][j]==1: # 遇到新岛屿
                    island_num += 1 # 岛屿编号从2开始
                    # dfs(i,j,island_num) # 法1
                    area[island_num]=bfs(i,j,island_num) 
        ans=0
        for i in range(m):
            for j in range(n):
                s=set() # 去重
                if grid[i][j]==0:
                    for d in dirs:
                        nexti,nextj=i+d[0],j+d[1]
                        if 0 <= nexti < m and 0 <= nextj < n  and grid[nexti][nextj]!=0:
                            s.add(grid[nexti][nextj])
                    ans = max(ans,1+sum(area[idx] for idx in s))

        return ans if ans else n*n # 如果最后 ans 仍然为 0,说明所有格子都是 1,返回 n^2


127. 单词接龙

题目链接

在这里插入图片描述
在这里插入图片描述

一、BFS

class Solution(object):
    def ladderLength(self, beginWord, endWord, wordList):
        """
        :type beginWord: str
        :type endWord: str
        :type wordList: List[str]
        :rtype: int
        """
        wordset = set(wordList)
        if len(wordList)==0 or endWord not in wordset :
            return 0
        q = collections.deque()
        q.append(beginWord)
        visited=set(beginWord)
        step=1
        while q:
            level = len(q)
            for l in range(level):
                word = q.popleft()
                word_list = list(word)
                for i in range(len(word_list)):
                    origin_char=word_list[i]
                    for j in range(26):
                        word_list[i] = chr(ord('a')+j)
                        new_word = ''.join(word_list)
                        if new_word in wordset:
                            if new_word == endWord:
                                return step+1
                            if new_word not in visited:
                                q.append(new_word)
                                visited.add(new_word)
                    word_list[i]=origin_char
            step +=1
        return 0  

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

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

相关文章

解析capl文件生成XML Test Module对应的xml工具

之前一直用的CAPL Test Module来写代码&#xff0c;所有的控制都是在MainTest()函数来实现的&#xff0c;但是有一次&#xff0c;代码都写完了&#xff0c;突然需要用xml的这种方式来实现&#xff0c;很突然&#xff0c;之前也没研究过&#xff0c;整理这个xml整的一身汗&#…

【1】CPU飙升到200%以上问题汇总

原链接 【1】CPU飙升到200%以上问题汇总 CPU飙升到200%以上是生成中常见的问题 注意&#xff1a; 1. linux的cpu使用频率是根据cpu个数和核数决定的 2. top&#xff0c;然后你按一下键盘的1&#xff0c;这就是单个核心的负载&#xff0c;不然是所有核心的负载相加&#xff0c;…

Golang | 腾讯一面

go的调度 Golang的调度器采用M:N调度模型&#xff0c;其中M代表用户级别的线程(也就是goroutine)&#xff0c;而N代表的事内核级别的线程。Go调度器的主要任务就是N个OS线程上调度M个goroutine。这种模型允许在少量的OS线程上运行大量的goroutine。 Go调度器使用了三种队列来…

基于STM32瑞士军刀--【FreeRTOS开发】学习笔记(二)|| 堆 / 栈

堆和栈 1. 堆 堆就是空闲的一块内存&#xff0c;可以通过malloc申请一小块内存&#xff0c;用完之后使用再free释放回去。管理堆需要用到链表操作。 比如需要分配100字节&#xff0c;实际所占108字节&#xff0c;因为为了方便后期的free&#xff0c;这一小块需要有个头部记录…

2024年7月25日(Git gitlab以及分支管理 )

分布式版本控制系统 一、Git概述 Git 是一种分布式版本控制系统,用于跟踪和管理代码的变更。它是由Linus Torvalds创建的,最 初被设计用于Linux内核的开发。Git允许开发人员跟踪和管理代码的版本,并且可以在不同的开 发人员之间进行协作。 Github 用的就是Git系统来管理它们的…

JVM面试题之内存区域、类加载篇

文章目录 引言JVM是什么&#xff1f;1. JVM内存划分2. 对象如何在JVM中创建2.1 内存分配2.2 创建对象步骤 3. JVM类加载流程3.1 双亲委派 总结 引言 Java开发人员在面试中基本都会被问到关于JVM的问题。想要成为高级的开发人员&#xff0c;了解和学习Java运行的原理和JVM是必不…

webpack插件给所有的:src文件目录增加前缀

1.webpack4的版本写法 class AddPrefixPlugin {apply(compiler) {compiler.hooks.compilation.tap(AddPrefixPlugin, (compilation) > {HtmlWebpackPlugin.getHooks(compilation).beforeEmit.tapAsync(AddPrefixPlugin,(data, cb) > {// 使用正则表达式替换所有包含 /st…

阿里云服务器安装Anaconda后无法检测到

前言 问题如标题所言&#xff0c;就是conda -V验证错误&#xff0c;不过后来发现其实就是虽然安装时&#xff0c;同意了写入环境变量&#xff0c;但是其实还没有写入&#xff0c;需要手动写入。下面也会重复一遍安装流程。 安装 到[Anaconda下载处](Download Now | Anaconda)查…

基于微信小程序+SpringBoot+Vue的流浪动物救助(带1w+文档)

基于微信小程序SpringBootVue的流浪动物救助(带1w文档) 基于微信小程序SpringBootVue的流浪动物救助(带1w文档) 本系统实现的目标是使爱心人士都可以加入到流浪动物的救助工作中来。考虑到救助流浪动物的爱心人士文化水平不齐&#xff0c;所以本系统在设计时采用操作简单、界面…

通过IEC104转MQTT网关对接阿里云、华为云、亚马逊AWS、ThingsBoard、Ignition、Zabbix

随着工业互联网的快速发展&#xff0c;传统电力系统中的IEC 104协议设备正逐步向更加开放、灵活的物联网架构转型。MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;作为一种轻量级的消息传输协议&#xff0c;因其低带宽消耗、高可靠性和广泛的支持性&#xf…

【JavaSE】基础知识复习 (二)

1.面向对象 对象内存分析 举例&#xff1a; class Person { //类&#xff1a;人String name;int age;boolean isMale; } public class PersonTest { //测试类public static void main(String[] args) {Person p1 new Person();p1.name "赵同学";p1.age 20;p1.is…

CentOS搭建Apache服务器

安装对应的软件包 [roothds ~]# yum install httpd mod_ssl -y 查看防火墙的状态和selinux [roothds ~]# systemctl status firewalld [roothds ~]# cat /etc/selinux/config 若未关闭&#xff0c;则关闭防火墙和selinux [roothds ~]# systemctl stop firewalld [roothds ~]# …

使用html2canvas制作一个截图工具

0 效果 1 下载html2canvas npm install html2canvas --save 2 创建ClipScreen.js import html2canvas from html2canvas; // 样式 const cssText {box: overflow:hidden;position:fixed;left:0;top:0;right:0;bottom:0;background-color:rgba(255,255,255,0.9);z-index: 10…

【嵌入式硬件】快衰减和慢衰减

1.引语 在使用直流有刷电机驱动芯片A4950时,这款芯片采用的是PWM控制方式,我发现他的正转、反转有两种控制方式,分别是快衰减和慢衰减。 2.理解 慢衰减:相当于加在电机(感性原件)两端电压消失,将电机两端正负短接。 快衰减:相当于加在电机(感性原件)两端电压消失,将电机…

一篇文章讲清楚html css js三件套之html

目录 HTML HTML发展史 HTML概念和语法 常见的HTML标签: HTML 调试 错误信息分析 HTML文档结构 HTML5的新特性 结论 HTML HTML是网页的基础&#xff0c;它是一种标记语言&#xff0c;用于定义网页的结构和内容。HTML标签告诉浏览器如何显示网页元素&#xff0c;例如段落…

快速安装torch-gpu和Tensorflow-gpu(自用,Ubuntu)

要更详细的教程可以参考Tensorflow PyTorch 安装&#xff08;CPU GPU 版本&#xff09;&#xff0c;这里是有基础之后的快速安装。 一、Pytorch 安装 conda create -n torch_env python3.10.13 conda activate torch_env conda install cudatoolkit11.8 -c nvidia pip ins…

WINUI——Microsoft.UI.Xaml.Markup.XamlParseException:“无法找到与此错误代码关联的文本。

开发环境 VS2022 .net core6 问题现象 在Canvas内的子控件要绑定Canvas的兄弟控件的一个属性&#xff0c;在运行时出现了下述报错。 可能原因 在 WinUI&#xff08;特别是用于 UWP 或 Windows App SDK 的版本&#xff09;中&#xff0c;如果你尝试在 XAML 中将 Canvas 内的…

CSS 的工作原理

我们已经学习了CSS的基础知识,它的用途以及如何编写简单的样式表。在本课中,我们将了解浏览器如何获取 CSS 和 HTML 并将其转换为网页。 先决条件:已安装基本软件,了解处理文件的基本知识以及 HTML 基础知识(学习 HTML 简介。目的:要了解浏览器如何解析 CSS 和 HTML 的基…

pytorch前馈神经网络--手写数字识别

前言 具体内容就是&#xff1a; 输入一个图像&#xff0c;经过神经网络后&#xff0c;识别为一个数字。从而实现图像的分类。 资源&#xff1a; https://download.csdn.net/download/fengzhongye51460/89578965 思路&#xff1a; 确定输入的图像&#xff1a;会单通道灰度的…