zoukankan      html  css  js  c++  java
  • 329. 矩阵中的最长递增路径

    题目

    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
    ",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

     

  • 相关阅读:
    HttpServletRequest对象,自己学习的心得。
    @PathVariable注解的使用和@Requestparam
    微信小程序授权 获取用户的openid和session_key【后端使用java语言编写】,我写的是get方式,目的是测试能否获取到微信服务器中的数据,后期我会写上post请求方式。
    (转)ubuntu 14.04下安装hadoop2.6(伪分布式)
    数据库范式
    C与Python变量的区别
    python3获取当前目录(转)
    最大连续子数组积的线性解法
    最大子数组的线性解法
    windows7下python3.4.3 添加库路径(转)
  • 原文地址:https://www.cnblogs.com/BoysCryToo/p/13380212.html
Copyright © 2011-2022 走看看