2022.07.20
今年的蓝桥杯有些遗憾,21年7月份听说后端好找工作,就去学Java;今年有听说前端工资高,比较轻松,又在犹豫。在经过一番思考之后,选择自己感兴趣的方向。
class Solution(object):
def longestIncreasingPath(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: int
"""
if not matrix: # 矩阵为空返回0
return 0
DIRS = [(-1, 0), (1, 0), (0, -1), (0, 1)]
def dfs(row, column):
best = 1 # 初值为1
for dx, dy in DIRS:
newRow, newColumn = row + dx, column + dy
if 0 <= newRow < rows and 0 <= newColumn < columns and matrix[newRow][newColumn] > matrix[row][column]:
best = max(best, dfs(newRow, newColumn) + 1)
return best
ans = 0
rows, columns = len(matrix), len(matrix[0])
for i in range(rows):
for j in range(columns):
ans = max(ans, dfs(i, j))
return ans
class Solution(object):
def longestIncreasingPath(self, matrix):
"""
:type matrix: List[List[int]]
:rtype: int
"""
if not matrix:
return 0
m, n = len(matrix), len(matrix[0]) # 矩阵的行,矩阵的列
DIRS = [(-1, 0), (1, 0), (0, -1), (0, 1)]
def dfs(x0, y0):
if (x0, y0) in dic:
return dic[(x0, y0)]
sub_res = 0
for dx, dy in DIRS:
x = x0 + dx
y = y0 + dy
if 0 <= x < m and 0 <= y < n and matrix[x][y] > matrix[x0][y0]:
sub_res = max(sub_res, dfs(x, y))
dic[(x0, y0)] = 1 + sub_res
return dic[(x0, y0)]
res = 1
dic = dict()
for i in range(m):
for j in range(n):
res = max(res, dfs(i, j))
return res
时间复杂度:O( m n mn mn)O( m n mn mn),其中 m m m 和 n n n 分别是矩阵的行数和列数。深度优先搜索的时间复杂度是 O( V V V+ E E E),其中 V V V 是节点数, E E E 是边数。在矩阵中,O( V V V)=O( m n mn mn),O( E E E) ≈ \approx ≈ O( 4 m n 4mn 4mn) = O( m n mn mn)。
空间复杂度:O( m n mn mn),其中 m m m 和 n n n 分别是矩阵的行数和列数。空间复杂度主要取决于缓存和递归调用深度,缓存的空间复杂度是 O( m n mn mn),递归调用深度不会超过 m n mn mn。