矩阵搜索

  • 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

算法(28)--矩阵搜索系列相关推荐

  1. AI面试锦囊|字节算法工程师(搜索广告方向)三面分享

    ©原创作者 | 三金 写在前面 目前短视频行业越来越火爆,推荐算法.广告算法引擎已经成为了各个大厂的核心业务系统.在此背景下,字节跳动的搜索团队就主要负责抖音.今日头条.西瓜视频等产品的搜索算法创新和 ...

  2. ElasticSearch 2 (16) - 深入搜索系列之近似度匹配

    ElasticSearch 2 (16) - 深入搜索系列之近似度匹配 摘要 标准的全文搜索使用TF/IDF处理文档.文档里的每个字段或一袋子词.match 查询可以告诉我们哪个袋子里面包含我们搜索的 ...

  3. 推荐算法之--矩阵分解(Matrix Factorization)

    文章目录 推荐算法之--矩阵分解(Matrix Factorization) 1. 共现矩阵 2. 矩阵分解(MF) 3. SVD实现矩阵分解(MF) 4. 梯度下降 实现 矩阵分解(MF) 4.1 ...

  4. 豪斯荷尔德变换及变形QR算法对矩阵进行奇异值分解VB算法

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  5. matlab中服从高斯分布的矩阵_推荐基础算法之矩阵分解PMF

    推荐基础算法之矩阵分解PMF 大多数存在的协同过滤算法不能处理以下两种情况: 1. 不能处理大规模数据 2.不能处理评分非常少的用户数据 概率矩阵分解模型可以解决大规模.稀疏且不平衡的数据.这篇文章主 ...

  6. 矩阵乘法 算法训练 试题_蓝桥杯习题集_ 算法训练 矩阵乘法

    原文: 算法训练 矩阵乘法 时间限制:1.0s   内存限制:512.0MB 问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s, ...

  7. 算法导论--广度优先搜索和深度优先搜索

    广度优先搜索 在给定图G=(V,E)和一个特定的源顶点s的情况下,广度优先搜索系统地探索G中的边,以期"发现"可从s 到达的所有顶点,并计算s 到所有这些可达顶点之间的距离(即最少 ...

  8. 深度搜索和广度搜索领接表实现_数据结构与算法--图的搜索(深度优先和广度优先)...

    数据结构与算法--图的搜索(深度优先和广度优先) 有时候我们需要系统地检查每一个顶点或者每一条边来获取图的各种性质,为此需要从图的某个顶点出发,访遍图中其余顶点,且使得每一个顶点只被访问一次,这个过程 ...

  9. 常用算法2 - 广度优先搜索 深度优先搜索 (python实现)

    1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...

最新文章

  1. phalcon php 5.4,如何在php上安装phalcon
  2. [Java工程师面试精选]Redis cluster集群模式的原理
  3. 过去一周AI领域有哪些新鲜事?看这一篇就够了
  4. CPU 空闲时在干嘛?
  5. pytorch学习:xavier分布和kaiming分布
  6. 十三、欧拉离散化计算期权定价期权定价
  7. 九大排序算法Java实现
  8. java线程池返回线程状态_Java线程的不同状态
  9. vs2017常量文本字符串无法转换成char*
  10. java hough_java – 如何实现Hough变换?
  11. 安卓开发 xml添加滑动条
  12. 单片机c语言论文,基于51单片机的C语言程序设计论文.doc
  13. 网站被移动运营方屏蔽怎么办?
  14. 面试计算机有什么优势和不足,面试时如何介绍自己的优缺点
  15. 【Eclipse】关闭单词拼写检查
  16. 学渣的刷题之旅 leetcode刷题 3. 无重复字符的最长子串(暴力法、滑动窗口)
  17. 10.HTML标题标记
  18. 新装的windows遇到命令行脚本无法执行
  19. 高中数学压轴题:由正余弦定理判断三角形的形状(名师总结)
  20. install brew cask

热门文章

  1. python输入序列语句_Python基础教程(一) - 序列:字符串、列表和元组
  2. c++界面开发_QT开发(三)——GUI原理分析
  3. 石头剪刀布python代码_python实现石头剪刀布程序
  4. c语言二进制数怎么表示_搞懂这些公式和原理,二级C语言对你来说肯定会简单很多!...
  5. 连接网络后浏览器却上不了网
  6. DotNet进阶系列
  7. 【转】OneDrive开发入门
  8. 850是什么意思_沃尔沃为什么不是一线豪华品牌?
  9. JS 给某个对象添加专属方法
  10. PWN-PRACTICE-BUUCTF-12