329. 矩陣中的最長遞增路徑 - 7月26日
阿新 • • 發佈:2020-07-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