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;
    }
};
相关推荐
weixin_424183615 小时前
开放—封闭原则实战(下):基于策略的流程编排与编译期多态
c++·分布式·系统架构
wuminyu6 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
小蒋学算法6 小时前
算法-交替删除操作后最后剩下的整数-跟着灵茶山艾府学算法
数据结构·算法
m0_380743876 小时前
C++中的freopen的用法实例详解
开发语言·c++
荆棘鸟智能6 小时前
林业遥感长势评估怎么做?从NDVI时序分析到LiDAR蓄积量回归
人工智能·算法·智慧林业
jimy17 小时前
polymorph.cpp里面的“析构函数、智能指针”问题
开发语言·c++
hhb_6187 小时前
AIRAGDebug:一键定位RAG链路异常
人工智能·python·算法
朝朝辞暮i7 小时前
C++ 第 6 课:switch —— 多状态选择
开发语言·c++·算法
朝朝辞暮i8 小时前
C++ 第 4 课:if / else —— 让程序自己做决定
开发语言·c++
苏打豆8 小时前
Pinocchio源码阅读——刚体运动物理量空间变换及求导
c++·线性代数·算法·矩阵·机器人