leetcode 329 矩阵中的最长递增路径

一、问题描述

二、解题思路

解法一:深度优先搜索

(1)整体思路

可以采用深度优先搜索+剪枝来解决这个问题。遍历matrix数组,对每一个位置进行深度优先搜索,找到以该位置为起点的递增路径的最大长度,遍历完matrix数组后,最长的递增路径的长度即为所求。

(2)函数功能:

dfs函数用于返回以(i,j)为起点的递增路径的最大长度。

(3)dfs函数体

1>变量longth用于记录递增路径的长度,初始化为1;

2>按照上、右、下、左的顺序从(i,j)位置进行探索,如果matrixij<matrixxy且x和y不越界,就就将path更新为max(path,dfs(matrix,x,y)+1);

3>最后返回path即可;

解法二:记忆化搜索

由于解法一存在大量的重复计算,所以我们可以定义一个数组memo来记录已经计算过的量,memoij即为dfs(matrix,i,j)的值:

(1)如果memoij!=0,就表示这个值已经计算过了,直接返回memoij

(2)如果没有被计算,就进入下面的循环,再在返回path之前更新memoij

三、代码实现

解法一:深度优先搜索(超时)

cpp 复制代码
class Solution {
    int m,n;
public:
    int longestIncreasingPath(vector<vector<int>>& matrix) {
       //初始化全局变量
       m=matrix.size();
       n=matrix[0].size();

       int ret=0;
       for(int i=0;i!=m;i++)
        for(int j=0;j!=n;j++)
            ret=max(ret,dfs(matrix,i,j));

        return ret;
    }
    int dx[4]={0,1,0,-1};
    int dy[4]={1,0,-1,0};

    int dfs(vector<vector<int>>& matrix,int i,int j){
        int longth=1;
        for(int k=0;k!=4;k++){
            int x=i+dx[k];
            int y=j+dy[k];
            if(x>=0&&x<m&&y>=0&&y<n&&matrix[i][j]<matrix[x][y])
                longth=max(longth,dfs(matrix,x,y)+1);
        }
        return longth;
    }
};

解法二:记忆化搜索(优化)

cpp 复制代码
class Solution {
    int m,n;
    vector<vector<int>> memo;
public:
    int longestIncreasingPath(vector<vector<int>>& matrix) {
       //初始化全局变量
       m=matrix.size();
       n=matrix[0].size();
       memo.resize(m,vector<int>(n,0));

       int ret=0;
       for(int i=0;i!=m;i++)
        for(int j=0;j!=n;j++)
            ret=max(ret,dfs(matrix,i,j));

        return ret;
    }
    int dx[4]={0,1,0,-1};
    int dy[4]={1,0,-1,0};

    int dfs(vector<vector<int>>& matrix,int i,int j){
        int longth=1;
        if(memo[i][j]!=0) return memo[i][j];

        for(int k=0;k!=4;k++){
            int x=i+dx[k];
            int y=j+dy[k];
            if(x>=0&&x<m&&y>=0&&y<n&&matrix[i][j]<matrix[x][y])
                longth=max(longth,dfs(matrix,x,y)+1);
        }
        memo[i][j]=longth;
        return longth;
    }
};
相关推荐
洋不写bug7 小时前
排序(一)基础排序,插入|希尔|冒泡|直接选择排序详解
java·算法·排序算法·插入排序·冒泡排序·希尔排序·直接选择排序
牧羊人.3337 小时前
动手学深度学习 03 | 卷积神经网络实现手写数字识别
人工智能·深度学习·神经网络·算法·cnn
AgentMaster8 小时前
数据治理工具选型指南:一套可复用的四阶段决策框架
大数据·数据结构·人工智能·算法
程序猿编码8 小时前
纯C++轻量计算机视觉推理引擎:基于GGML的端侧CV模型部署技术全解析
开发语言·c++·计算机视觉·大模型·transformer
liliangcsdn8 小时前
最终留出样本/样本外测试集-holdout解读
算法
爱敲代码的小黄9 小时前
机器学习入门:从数据、训练到业务决策
算法
数据知道9 小时前
哈希与密码存储——bcrypt、Argon2、盐值与彩虹表
网络·算法·安全·网络安全·密码学·哈希算法
haon11229 小时前
树模型在信贷风控怎么用——从决策树到 XGBoost
大数据·人工智能·算法·决策树·机器学习·数据挖掘
wordbaby9 小时前
BM25 是什么?手把手拆解搜索引擎的核心算法
人工智能·算法