1. 程式人生 > 實用技巧 >329. 矩陣中的最長遞增路徑 - 7月26日

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 const與constexprhttps://blog.csdn.net/Function_Dou/article/details/84523482