算法(28)--矩阵搜索系列

矩阵搜索

  • 1.leetcode-200. 岛屿数量
  • 2.leetcode-695. 岛屿的最大面积
  • 3.leetcode-463. 岛屿的周长
  • 4.剑指 Offer 12. 矩阵中的路径
  • 5.leetcode-329. 矩阵中的最长递增路径
  • 6.leetcode-1091. 二进制矩阵中的最短路径

1.leetcode-200. 岛屿数量

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

class Solution(object):def numIslands(self, grid):def dfs(r,c):grid[r][c]="0"for i,j in [(r+1,c),(r-1,c),(r,c+1),(r,c-1)]:if 0<=i<m and 0<=j<n and grid[i][j]=="1":# print(i,j)dfs(i,j)count=0m=len(grid)if m==0:return countn=len(grid[0])for r in range(m):for c in range(n):if  grid[r][c]=="1":count+=1dfs(r,c)return count

2.leetcode-695. 岛屿的最大面积

给定一个包含了一些 0 和 1 的非空二维数组 grid 。

一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。

找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)

class Solution(object):def __init__(self):self.count=0def maxAreaOfIsland(self, grid):def dfs(r,c):grid[r][c]=0 self.count+=1for i,j in [(r+1,c),(r-1,c),(r,c+1),(r,c-1)]:if 0<=i<m and 0<=j<n and grid[i][j]==1:dfs(i,j)res=0m=len(grid)if m==0:return resn=len(grid[0])for r in range(m):for c in range(n):if grid[r][c]==1:self.count=0dfs(r,c)res=max(res,self.count)return res

3.leetcode-463. 岛屿的周长

给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。
网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。

岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

在这里插入图片描述
只有一个岛屿
从陆地走向边界/水域,边长+1。判断下一个坐标是边界位置还是水域,从而改变总周长。

class Solution(object):def __init__(self):self.res = 0def islandPerimeter(self, grid):def dfs(i,j):# print(i,j, self.res)grid[i][j] = 2for r, c in [(i+1, j), (i-1, j), (i, j+1), (i, j-1)]:  # 走四个方向,看会发生什么情况嘛if r < 0 or r >= m or c < 0 or c >= n:     # 往边界走了一格,# print("bian",i,j,r,c)self.res += 1if 0<= r < m and 0<= c < n and grid[r][c] == 0 : # 往水域走了一格# print("shui",i,j,r,c)self.res +=1if 0<= r < m and 0<= c < n and grid[r][c] == 1:   dfs(r,c)m = len(grid)if m == 0:return 0n = len(grid[0])for i in range(m):   # 要区别是走过的陆地不能走还是原本就是水域不能走for j in range(n):# print(i,j)if grid[i][j] == 1:dfs(i,j)return self.resgrid=[[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]]
so = Solution()
print(so.islandPerimeter(grid))

4.剑指 Offer 12. 矩阵中的路径

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。

[[“a”,“b”,“c”,“e”],
[“s”,“f”,“c”,“s”],
[“a”,“d”,“e”,“e”]]

但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。

约束:不能两次经过同一个点
矩阵中的每一个元素,dfs + visted矩阵,上下左右匹配当前字符,
visted矩阵通过标记字符来实现

递归前保证矩阵下标的合理性,递归出口由匹配情况控制
1.word==""
2.len(word) == 1 and board[i][j] == word[0]
3.board[i][j] != word[0]
其他情况都是往下递归

class Solution(object):def exist(self, board, word):# board[i][j] 都进行深度优先匹配def dfs(i,j,word):if len(word) == 0:    # word 为空字符串时,匹配完成return Trueif len(word) == 1 and board[i][j] == word[0]:  # 防止[i][j]下一步都是边界且是访问过的情况,虽然已经匹配,但是结果是false,[["a"]]"a"return Trueif board[i][j] != word[0]: # 第一字符不匹配,完全不用递归,直接输出return Falsetmp = board[i][j]                           # 完全没有考虑不能重复走 board[i][j] = Nonefor r,c in [(i+1,j),(i-1,j),(i,j+1),(i,j-1)]: # 第一哥字符匹配,递归处理if 0<= r < m and 0 <= c < n:if dfs(r,c,word[1:]):  # 如果四个方向中有一格方向是可行的就返回True       return Trueboard[i][j] = tmpreturn False                # 第一个字符匹配了,但是后面的都不配,输出Falsem = len(board)if m == 0:return word == "" n = len(board[0])for i in range(m):for j in range(n):if dfs(i,j,word):return Truereturn False  # 所有遍历过了,没有就输出false#[["a"]],"a"
#[["a"]],"a"

5.leetcode-329. 矩阵中的最长递增路径

给定一个整数矩阵,找出最长递增路径的长度。
对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。

输入: nums = 
[[9,9,4],[6,6,8],[2,1,1]
] 
输出: 4 
解释: 最长递增路径为 [1, 2, 6, 9]

keypoint:
1.递增天然的不会两次走过同一个单元
2.dp[i][j] 以matrix[i][j]开始的最长递增路径

class Solution(object):def longestIncreasingPath_cyy(self, matrix):def dfs(i,j):if dp[i][j]:return dp[i][j]for r, c in [(i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1)]:if 0<= r < m and 0 <= c < n  and matrix[r][c] > matrix[i][j]:dp[i][j] = max(dp[i][j], dfs(r,c))  # 下一层的最大深度dp[i][j] += 1  # 本层的深度在下层深度的基础上+1return dp[i][j]m = len(matrix)if m == 0:return 0n = len(matrix[0])dp = [[0] * n for _ in range(m)]  # dp[i][j] 开始的最长路径res = 0for i in range(m):for j in range(n):res = max(res,dfs(i,j))# print(dp)return res

6.leetcode-1091. 二进制矩阵中的最短路径

在一个 N × N 的方形网格中,每个单元格有两种状态:空(0)或者阻塞(1)。

一条从左上角到右下角、长度为 k 的畅通路径,由满足下述条件的单元格 C_1, C_2, …, C_k 组成:

相邻单元格 C_i 和 C_{i+1} 在八个方向之一上连通(此时,C_i 和 C_{i+1} 不同且共享边或角)
C_1 位于 (0, 0)(即,值为 grid[0][0])
C_k 位于 (N-1, N-1)(即,值为 grid[N-1][N-1])
如果 C_i 位于 (r, c),则 grid[r][c] 为空(即,grid[r][c] == 0)
返回这条从左上角到右下角的最短畅通路径的长度。如果不存在这样的路径,返回 -1 。

最短路径问题:BFS

def shortestPathBinaryMatrix(self, grid):n = len(grid)if grid[0][0] == 1 or grid[-1][-1] == 1:return -1if n == 1:                # [[0]]这种特殊情况return 1res = 1que = [(0,0)]while(que):l = len(que)for i in range(l):(i,j) = que.pop(0)for (r,c) in [(i-1,j-1),(i-1,j),(i-1,j+1),(i,j-1),(i,j+1),(i+1,j-1),(i+1,j),(i+1,j+1)]:if 0<= r < n and 0<= c < n and grid[r][c] == 0: # 有效坐标 并且能走if r == n-1 and c == n-1:        # 能走到了终点return res + 1que.append((r,c))                # 能走没到终点grid[r][c] = 1                   # 已经走过的地方不能再走,不然就会一直进队出队res += 1                                     # 广度优先的层数return -1

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

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

相关文章

leetcode213 打家劫舍II

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈&#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚…

PaperNotes(4)-高质量图像生成-CGAN-StackGAN-Lapgan-Cyclegan-Pix2pixgan

cgan,stackgan,lapgan,cyclegan,pix2pixgan1.Conditional GAN1.1简介1.2网络结构与训练1.3特点与用途2.Stack GAN2.1简介2.2网络结构与训练2.3特点与用途3.Lap GAN3.1简介3.2网络结构与训练3.3特点与用途4.Pix2pix GAN4.1 简介4.2 网络结构和训练4.3 特点和用途5.Patch GAN6.Cy…

leetcode206 反转链表

反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题&#xff1f; 经典题不解释 /*** Definition for singly-linked list.* public class ListNode…

leetcode 152 乘积最大子序列

给定一个整数数组 nums &#xff0c;找出一个序列中乘积最大的连续子序列&#xff08;该序列至少包含一个数&#xff09;。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子…

PaperNotes(5)-Conditional Generative Adversarial Nets

Conditional GAN 论文阅读笔记Abstract1 Introduction2 Related Work3 Conditional Adversarial Nets3.1 Generative Adversarial Nets3.2 Conditional Adversarial Nets4 Experimental Results4.1 Unimodal4.2 Multimodal5 Future Work6.思考文章地址&#xff1a;https://arxi…

蛙泳姿势教学

偶尔看到分享的一篇日志&#xff0c;记录下&#xff0c;忙过这段时间努力学蛙泳。 蛙泳配合有一个顺口溜&#xff0c;在讲解蛙泳动作要领之前先介绍给大家&#xff1a;“划手腿不动&#xff0c;收手再收腿&#xff0c;先伸胳膊后蹬腿&#xff0c;并拢伸直漂一会儿。”从顺口溜中…

leetcode238 除本身以外数组的乘积

给定长度为 n 的整数数组 nums&#xff0c;其中 n > 1&#xff0c;返回输出数组 output &#xff0c;其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。 示例: 输入: [1,2,3,4] 输出: [24,12,8,6] 说明: 请不要使用除法&#xff0c;且在 O(n) 时间复杂度内完…

C++(2)--mac使用VScode 进行C++编译、运行、调试

mac 使用VScode 进行C开发1.编译的基础概念2. mac 编译c代码2.1 查看编译器情况2.2 安装插件C/C&#xff0c;C/C Clang Command Adapte2.3新建一个C project2.3.1本地新建文件夹2.3.2新建mian.cpp文件2.3.3 编写hello word demo2.4 代码编译&#xff0c;运行&#xff0c;调试2.…

leetcode136 只出现一次的数字

给定一个非空整数数组&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 说明&#xff1a; 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗&#xff1f; 示例 1: 输入: [2,2,1] 输出: 1 示例 2: …

leetcode94 二叉树的中序遍历

给定一个二叉树&#xff0c;返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单&#xff0c;你可以通过迭代算法完成吗&#xff1f; 递归 /*** Definition for a binary tree node.* public class TreeNode …

leetcode647 回文子串

给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被计为是不同的子串。 示例 1: 输入: "abc" 输出: 3 解释: 三个回文子串: "a", "…

windows下关于Objective-C开发环境的配置

最近IOS一直很火&#xff0c;也想学习以以下OC开发&#xff0c;一般装个虚拟机&#xff0c;然后装个mac&#xff0c;我相信大多数人的机子跑不起来或者很卡&#xff0c;所以之前借鉴了一个文章&#xff0c;就是关于在windows下配置OC开发环境&#xff0c;这里我把自己的安装说一…

PaperNotes(6)-GAN/DCGAN/WGAN/WGAN-GP/WGAN-SN-网络结构/实验效果

GAN模型网络结构实验效果演化1.GAN1.1网络结构1.2实验结果2.DCGAN2.1网络结构2.2实验结果3.WGAN3.1网络结构3.2实验结果4.WGAN-GP4.1网络结构4.2实验结果5.WGAN-SN5.1网络结构5.2实验结果小结1.GAN 文章&#xff1a; https://arxiv.org/pdf/1406.2661.pdf 代码&#xff1a; Py…

Spring Security使用

Spring Security 在web应用开发中&#xff0c;安全无疑是十分重要的&#xff0c;选择Spring Security来保护web应用是一个非常好的选择。 Spring Security 是spring项目之中的一个安全模块&#xff0c;可以非常方便与spring项目无缝集成。特别是在spring boot项目中加入sprin…

leetcode115 不同的子序列

给定一个字符串 S 和一个字符串 T&#xff0c;计算在 S 的子序列中 T 出现的个数。 一个字符串的一个子序列是指&#xff0c;通过删除一些&#xff08;也可以不删除&#xff09;字符且不干扰剩余字符相对位置所组成的新字符串。&#xff08;例如&#xff0c;"ACE" 是…

leetcode104 二叉树的最大深度

给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 示例&#xff1a; 给定二叉树 [3,9,20,null,null,15,7]&#xff0c; 3 / \ 9 20 / \ 15 7 返回它的最大深度…

leetcode105 前序中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如&#xff0c;给出 前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树&#xff1a; 3 / \ 9 20 / \ 15 7 思路&#xff1a; 1、…

leetcode144 二叉树的前序遍历

给定一个二叉树&#xff0c;返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单&#xff0c;你可以通过迭代算法完成吗&#xff1f; 思路&#xff1a;模仿递归的思路压栈即可。 /*** Definition for a bi…

AJAX大总结

1、AJAX概述 1.1 什么是AJAX AJAX&#xff08;Asynchronous Javascript And XML&#xff09;翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互&#xff0c;传输的数据为XML&#xff08;当然&#xff0c;传输的数据不只是XML&#xff09;。 …

关系数据库——mysql数据类型大总结

整数类型&#xff1a; 实数类型&#xff1a; 定点数&#xff1a;DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值。 DECIMAL(M,D)&#xff0c;其中M表示十进制数字总的个数&#xff0c;D表示小数点后面数字的位数。 如果存储时&#xff0c;整…