classSolution{int[][] dir ={{0,1},{1,0},{-1,0},{0,-1}};publicintlongestIncreasingPath(int[][] matrix){int n = matrix.length;int m = matrix[0].length;int[] indeg =newint[m * n];
List<Integer>[] sons =newArrayList[m * n];for(int i =0; i < n; i ++){for(int j =0; j < m; j ++){int id1 = i * m + j;for(int k =0; k <4; k ++){int _i = i + dir[k][0];int _j = j + dir[k][1];if(_i >=0&& _i < n && _j >=0&& _j < m && matrix[i][j]< matrix[_i][_j]){int id2 = _i * m + _j;
indeg[id2]++;if(sons[id1]== null) sons[id1]=newArrayList<Integer>();
sons[id1].add(id2);}}}}int[] len =newint[m * n];
Queue<Integer> q =newLinkedList<Integer>();for(int i =0; i < m * n; i ++){if(indeg[i]==0&& sons[i]!= null) q.add(i);}while(!q.isEmpty()){int cur = q.poll();for(int i : sons[cur]){
indeg[i]--;
len[i]= Math.max(len[i], len[cur]+1);if(indeg[i]==0&& sons[i]!= null) q.add(i);}}int ans =0;for(int i =0; i < n * m; i++) ans = Math.max(ans, len[i]);return ans +1;}}