《你也能看得懂的Python算法书》学习笔记(五)

2024-04-20 05:32

本文主要是介绍《你也能看得懂的Python算法书》学习笔记(五),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在学习笔记四中我们使用深度优先遍历算法解决了一道以二叉树作为数据结构的题目。笔记五我们继续讲解一道可以使用深度优先遍历算法来解决的问题。

题目描述:我们使用二维数组来表示一片海域,0表示水面,1表示岛屿。我们的任务是找到面积最大的岛屿。下面左图是岛屿的示意图,右图是最大岛屿示意图。

解题思路:

要寻找面积最大的岛屿,我们需要将海域中所有岛屿的面积都计算出来之后进行比较。在计算岛屿的面积之前,我们应该首先了解如何去发现陆地。因为陆地所对应坐标上的值都是1,因此我们可以进行网格式搜索,找到值为一的坐标所对应的地方就是岛屿。

代码如下:

    def maxAreaOfIsland(self, grid):self.maxArea = 0row = len(grid)col = len(grid[0])for i in range(row):for j in range(col):if grid[i][j] == 1:return self.maxArea

找到值为1的地方其实就相当于我们我们登上了岛屿,接下来我们需要测量这个岛屿的面积。由于岛屿是由上下左右这四个方向的陆地组成的,所以我们可以规定一种查找顺序,全部按照上下左右四个方向进行顺序查找。 现在就可以开始用深度优先遍历算法来测算岛屿的面积了,从登陆岛屿的第一个平方米开始就要按照规定的顺序不断地计算岛屿的平方米数,直到走到不能走为止才可以更换方向,为了不重复计算,我们就将修改走过的陆地所对应的值为2。

下面这个例子可以让大家更熟悉这个算法的流程:

首先我们向上寻找,发现已经超出了地图的边界,于是向下寻找发现陆地,便移动过去,这个时候要将数值改成2表示已经访问过。

接着我们在第二块陆地上继续寻找,发现向上没有未访问过的陆地,向下和向左都是海水,最后向右走发现是陆地,于是移动过去。之后继续使用上下左后的顺序进行寻找,发现上方是陆地,于是移动过去。

 

这个时候我们可以发现已经没有陆地了,于是我们退回到上一步的位置,继续换个方式寻找陆地。同样,上一步也没有了,我们就继续后退,直到回到最初点,真个搜索过程结束。这就是深度优先搜索的全部过程。

我们将定义一个函数来表示深度优先算法:

    def dfs(self, k, z, current, grid):grid[k][z] = 2if k > 0 and grid[k - 1][z] == 1:current = self.dfs(k - 1, z, current + 1, grid)if k < (len(grid) - 1) and grid[k + 1][z] == 1:current = self.dfs(k + 1, z, current + 1, grid)if z > 0 and grid[k][z - 1] == 1:current = self.dfs(k, z - 1, current + 1, grid)if z < (len(grid[0]) - 1) and grid[k][z + 1] == 1:current = self.dfs(k, z + 1, current + 1, grid)self.maxArea = max(self.maxArea, current)return current

 最后将网格搜索陆地和在陆地上进行深度优先搜素岛屿面积合并在一起,代码如下:

class solution:def maxAreaOfIsland(self, grid):self.maxArea = 0row = len(grid)col = len(grid[0])for i in range(row):for j in range(col):if grid[i][j] == 1:current = 1self.dfs(i, j, current, grid)return self.maxAreadef dfs(self, k, z, current, grid):grid[k][z] = 2if k > 0 and grid[k - 1][z] == 1:current = self.dfs(k - 1, z, current + 1, grid)if k < (len(grid) - 1) and grid[k + 1][z] == 1:current = self.dfs(k + 1, z, current + 1, grid)if z > 0 and grid[k][z - 1] == 1:current = self.dfs(k, z - 1, current + 1, grid)if z < (len(grid[0]) - 1) and grid[k][z + 1] == 1:current = self.dfs(k, z + 1, current + 1, grid)self.maxArea = max(self.maxArea, current)return current

这篇关于《你也能看得懂的Python算法书》学习笔记(五)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/919388

相关文章

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、

浅析Python中的绝对导入与相对导入

《浅析Python中的绝对导入与相对导入》这篇文章主要为大家详细介绍了Python中的绝对导入与相对导入的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1 Imports快速介绍2 import语句的语法2.1 基本使用2.2 导入声明的样式3 绝对import和相对i

Python中配置文件的全面解析与使用

《Python中配置文件的全面解析与使用》在Python开发中,配置文件扮演着举足轻重的角色,它们允许开发者在不修改代码的情况下调整应用程序的行为,下面我们就来看看常见Python配置文件格式的使用吧... 目录一、INI配置文件二、YAML配置文件三、jsON配置文件四、TOML配置文件五、XML配置文件

Python中conda虚拟环境创建及使用小结

《Python中conda虚拟环境创建及使用小结》本文主要介绍了Python中conda虚拟环境创建及使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录0.前言1.Miniconda安装2.conda本地基本操作3.创建conda虚拟环境4.激活c

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

一文详解如何在Python中使用Requests库

《一文详解如何在Python中使用Requests库》:本文主要介绍如何在Python中使用Requests库的相关资料,Requests库是Python中常用的第三方库,用于简化HTTP请求的发... 目录前言1. 安装Requests库2. 发起GET请求3. 发送带有查询参数的GET请求4. 发起PO

Python与DeepSeek的深度融合实战

《Python与DeepSeek的深度融合实战》Python作为最受欢迎的编程语言之一,以其简洁易读的语法、丰富的库和广泛的应用场景,成为了无数开发者的首选,而DeepSeek,作为人工智能领域的新星... 目录一、python与DeepSeek的结合优势二、模型训练1. 数据准备2. 模型架构与参数设置3

Python进行PDF文件拆分的示例详解

《Python进行PDF文件拆分的示例详解》在日常生活中,我们常常会遇到大型的PDF文件,难以发送,将PDF拆分成多个小文件是一个实用的解决方案,下面我们就来看看如何使用Python实现PDF文件拆分... 目录使用工具将PDF按页数拆分将PDF的每一页拆分为单独的文件将PDF按指定页数拆分根据页码范围拆分

Python中常用的四种取整方式分享

《Python中常用的四种取整方式分享》在数据处理和数值计算中,取整操作是非常常见的需求,Python提供了多种取整方式,本文为大家整理了四种常用的方法,希望对大家有所帮助... 目录引言向零取整(Truncate)向下取整(Floor)向上取整(Ceil)四舍五入(Round)四种取整方式的对比综合示例应