1. 程式人生 > 實用技巧 >329. 矩陣中的最長遞增路徑(Leetcode每日一題)

329. 矩陣中的最長遞增路徑(Leetcode每日一題)

題目連結:https://leetcode-cn.com/problems/longest-increasing-path-in-a-matrix/

題解:

一開始想的是列舉起點然後跑BFS,這樣時間複雜度為o(n^2m^2),不太好。感覺官方題解的方法很秒,記憶化搜尋,時間複雜度為O(nm),簡單的介紹一下官方的思路,同樣的,列舉每個起點,然後引入一個記憶化陣列,如果這個點訪問過了,直接返回該點對應的值,如果沒有訪問過,那麼就訪問該點的四個方向........程式碼還是比較好理解的。

class Solution {
    int dp[1000+7][1000+7];
    int direction[4
][2]={{1,0},{0,1},{0,-1},{-1,0}}; public: int longestIncreasingPath(vector<vector<int>>& matrix) { int n=matrix.size(); if(n==0) return 0; int m=matrix[0].size(); if(m==0) return 0; int ans=0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ ans
=max(ans,dfs(matrix,i,j,n,m)); } } return ans; } int dfs(vector<vector<int >>&matrix,int x,int y,int n,int m){ if(dp[x][y]) return dp[x][y]; dp[x][y]=1; for(int i=0;i<4;i++){ int dx=x+direction[i][0];
int dy=y+direction[i][1]; if(dx<0||dy<0||dx>=n||dy>=m||matrix[dx][dy]<=matrix[x][y]) continue ; dp[x][y]=max(dp[x][y],dfs(matrix,dx,dy,n,m)+1); } return dp[x][y]; } };