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

一、问题描述

二、解题思路

解法一:深度优先搜索

(1)整体思路

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

(2)函数功能:

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

(3)dfs函数体

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

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

3>最后返回path即可;

解法二:记忆化搜索

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

(1)如果memo[i][j]!=0,就表示这个值已经计算过了,直接返回memo[i][j];

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

三、代码实现

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

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;
    }
};
相关推荐
Emilia486.4 小时前
【Leetcode&nowcode&数据结构】单链表的应用(初阶)
c语言·数据结构·算法·leetcode
_给我学起来4 小时前
字符数组和字符串
c++
JAVA学习通4 小时前
JDK高版本特性总结与ZGC实践
java·jvm·算法
syty20204 小时前
简简单单区块链
算法·哈希算法
CoovallyAIHub4 小时前
CLIP, DINO等多模型融合DreamSim,让电脑“看懂”图片有多像!模型融合成为热门!
深度学习·算法·计算机视觉
骁的小小站4 小时前
Learn C the Hardway学习笔记和拓展知识(一)
c语言·开发语言·c++·经验分享·笔记·学习·bash
Giser探索家4 小时前
遥感卫星升轨 / 降轨技术解析:对图像光照、对比度的影响及工程化应用
大数据·人工智能·算法·安全·计算机视觉·分类
仰泳的熊猫5 小时前
LeetCode:700. 二叉搜索树中的搜索
数据结构·c++·算法·leetcode
嵌入式-老费5 小时前
Easyx图形库应用(图形旋转)
算法