找到二维数组中最长的序列

时间:2017-10-14 03:51:48

标签: java matrix

enter image description here

我一直在研究这个问题,但无法提出解决方案;我希望你能帮忙..

我试图找到增长最快的数字序列。例如,如果我有以下4X4阵列:

[![enter image description here][1]][1]

    int [] nums = {
        {97 , 47 , 56 , 36},
        {35 , 57 , 41 , 13},
        {89 , 36 , 98 , 75},
        {25 , 45 , 26 , 17}
    };

预期结果:返回8和LIS 17,26,36,41,47,56,57,97 我还没有得到答案,我试图达到它。

17  (3,3)
26  (3,2)
36  (2,1)
41  (1,2)
47  (0,1)
56  (0,2)
57  (1,1)
97  (0,0)

我希望我的例子足够清楚......

这是我的代码;当我试图找到最长的路径时,它不会向后对角地进行。有人可以帮帮我吗?

public class Solution2 {
    static int[] dx = { 1, -1, 0, 0 };
    static int[] dy = { 0, 0, 1, -1 };
    public static int longestIncreasingPath(int[][] matrix) {
        if (matrix.length == 0)
            return 0;
        int m = matrix.length, n = matrix[0].length;
        int[][] dis = new int[m][n];
        int ans = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                ans = Math.max(ans, dfs(i, j, m, n, matrix, dis));
            }
        }
        return ans;
    }

    static int dfs(int x, int y, int m, int n, int[][] matrix, int[][] dis) {
        if (dis[x][y] != 0)
            return dis[x][y];

        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx >= 0 && ny >= 0 && nx < m && ny < n && matrix[nx][ny] > matrix[x][y]) {
                dis[x][y] = Math.max(dis[x][y], dfs(nx, ny, m, n, matrix, dis));
            }
        }
        return ++dis[x][y];
    }

    public static void main(String[] args) {
        int arr[][] = { 
          { 97, 47, 56, 36 }, 
          { 35, 57, 41, 13 }, 
          { 89, 36, 98, 75 }, 
          { 25, 45, 26, 17 }
        };
        System.out.println(longestIncreasingPath(arr));
    }
}

2 个答案:

答案 0 :(得分:2)

我认为我们正在寻找严格增加的序列(从原始问题描述中不清楚)。 然后可以通过动态编程方法解决这个问题:

1)按照递减的顺序对单元格进行排序。

2)按递减顺序指定从该单元格开始的最长路径的长度:

2a)如果你无法到达任何先前访问过的小区,则分配1

2b)否则分配1 + max(可达的前一个单元格)

完成此操作后,总体最大值是最长路径的长度。通过在步骤2b)中记住最大单元格也可以找到路径本身。

在示例中,这给出了:

                                            0,3 2,1
cell    98  97  89  75  57  56  47  45  41  36  36  35  26  25  17  13
length   1   1   1   2   2   3   4   2   5   6   6   7   7   7   8   7

答案 1 :(得分:0)

据我了解,您尝试实施深度优先搜索以找到增加顺序的最长路径。如果是这样,首先最好以某种方式标记您访问过的数字。一个方便的解决方案是array。只要标记了数字,您就可以使用它来检查特定数字是否已按递增顺序计数。这对你来说有点暗示。

如果您仍然对深度优先搜索感到困惑,我建议您阅读Depth-First Search Wikipedia page以更好地了解算法的全部内容。

HTH,Evgeniy