0562. 矩阵中最长的连续1线段
大约 2 分钟
--- 

0562. 矩阵中最长的连续1线段
- 标签:数组、动态规划、矩阵
- 难度:中等
题目链接
题目大意
描述:
给定一个二维二进制矩阵 。
要求:
找出矩阵中最长的连续 线段的长度。
这条线段可以是水平的、垂直的、对角线的或者反对角线的。
说明:
- 。
- 。
- 。
- 。
- 不是 就是 。
示例:
- 示例 1:

输入:mat = [[0,1,1,0],[0,1,1,0],[0,0,0,1]]
输出:3
解释:最长的连续 1 线段是对角线方向的,长度为 3。- 示例 2:

输入: mat = [[1,1,1,1],[0,1,1,0],[0,0,0,1]]
输出: 4
解释:最长的连续 1 线段是水平方向的,长度为 4。解题思路
思路 1:动态规划
使用三维 DP 数组 表示以位置 结尾、方向为 的最长连续 的长度。
方向 有 4 种:
- :水平方向(从左到右)
- :垂直方向(从上到下)
- :对角线方向(从左上到右下)
- :反对角线方向(从右上到左下)
状态转移:
- 如果 :
- (水平)
- (垂直)
- (对角线)
- (反对角线)
- 如果 :所有方向的 值都为
思路 1:代码
class Solution:
def longestLine(self, mat: List[List[int]]) -> int:
if not mat or not mat[0]:
return 0
m, n = len(mat), len(mat[0])
# dp[i][j][d] 表示以 (i,j) 结尾、方向 d 的最长连续 1 长度
# d: 0-水平, 1-垂直, 2-对角线, 3-反对角线
dp = [[[0] * 4 for _ in range(n)] for _ in range(m)]
max_len = 0
for i in range(m):
for j in range(n):
if mat[i][j] == 1:
# 水平方向
dp[i][j][0] = dp[i][j-1][0] + 1 if j > 0 else 1
# 垂直方向
dp[i][j][1] = dp[i-1][j][1] + 1 if i > 0 else 1
# 对角线方向
dp[i][j][2] = dp[i-1][j-1][2] + 1 if i > 0 and j > 0 else 1
# 反对角线方向
dp[i][j][3] = dp[i-1][j+1][3] + 1 if i > 0 and j < n - 1 else 1
# 更新最大值
max_len = max(max_len, max(dp[i][j]))
return max_len思路 1:复杂度分析
- 时间复杂度:,其中 和 分别是矩阵的行数和列数。需要遍历整个矩阵。
- 空间复杂度:,需要存储 DP 数组。可以优化到 使用滚动数组。