Skip to content

329. Longest Increasing Path in a Matrix

Leetcode - 329. Longest Increasing Path in a Matrix

Submission

package dev.namtx.leetcode;  

import java.util.Arrays;  

public class LongestIncreasingPathInAMatrix {  
    static final int[][] DIRS = new int[][]{  
            {0, 1}, {1, 0}, {-1, 0}, {0, -1}  
    };  
    int max = 0;  

    public int longestIncreasingPath(int[][] matrix) {  
        boolean[][] visited = new boolean[matrix.length][matrix[0].length];  
        int[][] longest = new int[matrix.length][matrix[0].length];  
        for (int[] row : longest) {  
            Arrays.fill(row, 1);  
        }  

        for (int i = 0; i < matrix.length; i++) {  
            for (int j = 0; j < matrix[0].length; j++) {  
                if (!visited[i][j]) {  
                    dfs(i, j, visited, longest, matrix);  
                }  
            }  
        }  
        return max;  
    }  

    public int dfs(int i, int j, boolean[][] visited, int[][] longest, int[][] matrix) {  
        if (visited[i][j]) return longest[i][j];  

        int m = 0;  
        for (int[] dir : DIRS) {  
            int x = i + dir[0];  
            int y = j + dir[1];  
            if (x >= 0 && x < matrix.length && y >= 0 && y < matrix[0].length && matrix[i][j] < matrix[x][y]) {  
                m = Math.max(m, dfs(x, y, visited, longest, matrix));  
            }  
        }  
        longest[i][j] += m;  
        visited[i][j] = true;  
        max = Math.max(max, longest[i][j]);  
        return longest[i][j];  
    }  

    public static void main(String[] args) {  
        int[][] matrix = new int[][]{  
                {9,9,4},{6,6,8},{2,1,1}  
        };  
        System.out.println(new LongestIncreasingPathInAMatrix().longestIncreasingPath(matrix));  
    }  
}