329. 矩阵中的最长递增路径 - 7月26日

题目

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

我的思路

我的思路与官方题解法一大同小异。

深搜+记忆化
使用一个同规格大小的memoryMatrix矩阵存储对应位置单元格作为起点的最大递增路径长度。

我的实现

 
class Solution {
public:
    int search(int cor_x,int cor_y,vector<vector<int>>& matrix,vector<vector<int>>& memoryMatrix){
        //递归终止的条件:1.当前方格已被搜索过,记忆矩阵中对应的路径长度大于0 2.该单元四周的方格值小于等于当前单元的方格值
        //进一步递归
        if(memoryMatrix[cor_x][cor_y]>0)return memoryMatrix[cor_x][cor_y];
        int length = 1;
        if(cor_x<matrix.size()-1){
            if(matrix[cor_x+1][cor_y]>matrix[cor_x][cor_y]){
                length = max(length,search(cor_x+1,cor_y,matrix,memoryMatrix)+1);
            }
        }
        if(cor_x>0){
            if(matrix[cor_x-1][cor_y]>matrix[cor_x][cor_y]){
                length = max(length,search(cor_x-1,cor_y,matrix,memoryMatrix)+1);
            }
        }
        if(cor_y<matrix[0].size()-1){
            if(matrix[cor_x][cor_y+1]>matrix[cor_x][cor_y]){
                length = max(length,search(cor_x,cor_y+1,matrix,memoryMatrix)+1);
            }
        }
        if(cor_y>0){
            if(matrix[cor_x][cor_y-1]>matrix[cor_x][cor_y]){
                length = max(length,search(cor_x,cor_y-1,matrix,memoryMatrix)+1);
            }
        }
        //当前层逻辑处理
        memoryMatrix[cor_x][cor_y] = length;
        return length;
        
        //善后处理
    }
    int longestIncreasingPath(vector<vector<int>>& matrix) {
        if (matrix.size() == 0 || matrix[0].size() == 0) return 0;
        int result=0;
        vector<int> temp(matrix[0].size(),0);
        vector<vector<int>> memoryMatrix(matrix.size(),temp);
        for(int i=0;i<matrix.size();i++){
            for(int j=0;j<matrix[0].size();j++){
                //printf("%d %d\n",i,j);
                result = max(result,search(i,j,matrix,memoryMatrix));
            }
        }
        return result;
    }

};
/*
我的思路是深搜+记忆化
使用一个同规格大小的memoryMatrix矩阵存储对应位置单元格作为起点的最大递增路径长度。
int search(int cor_x,int cor_y,vector<vector<int>>& matrix,vector<vector<int>>& memoryMatrix){
    //递归终止的条件:1.当前方格已被搜索过,记忆矩阵中对应的路径长度大于0 2.该单元四周的方格值小于等于当前单元的方格值
    if(memoryMatrix[cor_x][cor_y]>0)return memoryMatrix[cor_x][cor_y];
    int length = 1;
    if(cor_x<matrix.size()){
        if(matrix[cor_x+1][cor_y]>matrix[cor_x][cor_y]){
            length = max(length,search(cor_x+1,cor_y,matrix,memoryMatrix)+1);
        }
    }
    if(cor_x>0){
        if(matrix[cor_x-1][cor_y]>matrix[cor_x][cor_y]){
            length = max(length,search(cor_x-1,cor_y,matrix,memoryMatrix)+1);
        }
    }
    if(cor_y<matrix[0].size()){
        if(matrix[cor_x][cor_y+1]>matrix[cor_x][cor_y]){
            length = max(length,search(cor_x,cor_y+1,matrix,memoryMatrix)+1);
        }
    }
    if(cor_y>0){
        if(matrix[cor_x][cor_y-1]>matrix[cor_x][cor_y]){
            length = max(length,search(cor_x,cor_y-1,matrix,memoryMatrix)+1);
        }
    }
    //当前层逻辑处理
    memoryMatrix[cor_x][cor_y] = length;
    //进一步递归

    //善后处理
}
*/

时间复杂度是mn

空间复杂度也是mn

拓展学习

一点改进:在搜索临近方格时可以预先存储移动的向量(0,1),(0,-1),(1,0)等,代码会更优雅。静态常量变量可以在类中初始化https://blog.csdn.net/Clengupup/article/details/83059231

 

猜你喜欢

转载自www.cnblogs.com/BoysCryToo/p/13380212.html