329矩阵中的最长递增路径(递归DFS深度优先搜索+备忘录)

1、题目描述

给定一个整数矩阵,找出最长递增路径的长度。

对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。

2、示例

输入: nums = 
[
  [9,9,4],
  [6,6,8],
  [2,1,1]

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

3、题解

基本思想:DFS深度优先搜索+备忘录,遍历二维数组matrix每一个元素,以该元素出发能得到的最大递增序列长度len,如果比res大则更新res。

优化点:使用备忘录,遍历当前元素得到最大递增路径长度len后,保存该值到dp中,这样下次其他元素走到该元素的时候就可以直接返回以当前元素出发的最大递增路径长度,减少递归次数。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        //基本思想:递归DFS深度优先搜索+备忘录,遍历二维数组matrix每一个元素,以该元素出发能得到的最大递增序列长度len,如果比res大则更新res
        //优化点:遍历当前元素得到最大递增路径长度len后,保存该值到dp中
        //这样下次其他元素走到该元素的时候就可以直接返回以当前元素出发的最大递增路径长度,减少递归次数
        int res=0;
        if(matrix.size()==0)  return res;
        vector<vector<int>> dp(matrix.size(),vector<int>(matrix[0].size(),0));
        for(int i=0;i<matrix.size();i++)
            for(int j=0;j<matrix[i].size();j++)
                //以matrix[i][j]出发得到的最大递增序列长度,如果比res大则更新res
                res=max(res,Recursion(matrix,dp,i,j));
        return res;
    }
    int Recursion(vector<vector<int>>& matrix,vector<vector<int>>& dp,int i,int j)
    {
        //以matrix[i][j]位置元素出发,计算出最大递增路径长度保存至dp[i][j]并返回
        //如果dp[i][j]!=0说明已经计算出了最大递增路径长度,直接返回
        if(dp[i][j]!=0)  return dp[i][j];
        int len1=0,len2=0,len3=0,len4=0;
        if(i+1<matrix.size()&&matrix[i+1][j]>matrix[i][j])
            len1=Recursion(matrix,dp,i+1,j);
        if(i-1>=0&&matrix[i-1][j]>matrix[i][j])
            len2=Recursion(matrix,dp,i-1,j);
        if(j+1<matrix[i].size()&&matrix[i][j+1]>matrix[i][j])
            len3=Recursion(matrix,dp,i,j+1);
        if(j-1>=0&&matrix[i][j-1]>matrix[i][j])
            len4=Recursion(matrix,dp,i,j-1);
        dp[i][j]=max(len1,max(len2,max(len3,len4)))+1;
        return dp[i][j];
    }
};
int main()
{
    Solution solute;
    vector<vector<int>> matrix={
        {9,9,4},
        {6,6,8},
        {2,1,1}
    };
    cout<<solute.longestIncreasingPath(matrix)<<endl;
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值