329. Longest Increasing Path in a Matrix

该问题是一个典型的DFS(深度优先搜索)问题,结合记忆化技术来优化搜索过程。算法从矩阵中的每个单元格开始,向四个方向探索递增路径,并使用二维数组`mem`存储已计算过的路径长度,避免重复计算。在每个节点,算法比较并选择四个方向中路径最长的一个,最后返回最大路径长度。
摘要由CSDN通过智能技术生成

题目描述

Given an m x n integers matrix, return the length of the longest increasing path in matrix.

From each cell, you can either move in four directions: left, right, up, or down. You may not move diagonally or move outside the boundary (i.e., wrap-around is not allowed).
!https://assets.leetcode.com/uploads/2021/01/05/grid1.jpg

Example 1:

思路

dfs+记忆化,本题可以不必设置visited数组,可以由递增条件实现。时间复杂度O(MN),空间复杂度O(MN)

代码

func longestIncreasingPath(matrix [][]int) int {
    mem=make([][]int,len(matrix))
    for i:=0;i<len(matrix);i++{
        mem[i]=make([]int,len(matrix[0]))
    }
    res:=0
    for i:=0;i<len(matrix);i++{
	    for j:=0;j<len(matrix[0]);j++
	        res=max(res,process(matrix,i,j)) 
	    }
    }
    return res
}

var mem [][]int
 
func process(m [][]int, i,j int) int{
    fmt.Println("helo")
    fmt.Println(i,j)
    fmt.Println(mem[i][j])
    if mem[i][j]!=0{
        return mem[i][j]
    }
    res:=0
    
    if i+1<len(m)&&m[i][j]<m[i+1][j]{
        res=max(res,process(m,i+1,j))
    }
    if i-1>=0&&m[i][j]<m[i-1][j]{
        res=max(res,process(m,i-1,j))
    }
   
    if j+1<len(m[0])&&m[i][j]<m[i][j+1]{
        
        res=max(res,process(m,i,j+1))
    }
    if j-1>=0&&m[i][j]<m[i][j-1]{
        res=max(res,process(m,i,j-1))
    }
    mem[i][j]=res+1   
    return res+1
}

func max(a,b int)int{
    if a>b{
        return a
    }
    return b
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值