您的位置:首页 > 产品设计 > UI/UE

Longest Continuance Increasing sub-sequence in matrix

2016-04-03 06:24 471 查看
一个矩阵,求最长连续的序列长度

[1 2 3
4 5 6
7 8 9]
我的解法时用dfs遍历矩阵,如果便利过的元素就标记为false,不再遍历。
邻居 就是上下左右
e.g.
1 2 3
6 5 4 -> 7
7 9 8
===================
5 7 9
1 2 3 -> 3
4 6 8
===================
9 8 7
4 5 6 ->9
3 2 1
题目一. 只能上下左右,走到边界处止步
题目二. 每一行/列都是一个循环,走到边界处譬如第 0 列,可以继续走到另一边界,譬如 n-1

/*
* Graph DFS
*
* Find the Longest Continuance Increasing sub-sequence in 2d matrix
* You could go up, down, left, right in the matrix
*
*/

public class LIS2d {
public int findLongest(int[][] matrix) {
int max = 0;
int m = matrix.length, n = matrix[0].length;
boolean[][] visit = new boolean[m]
;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int len = helper(matrix, visit, i, j, 1);
max = max > len ? max : len;
}
}
return max;
}
public int helper(int[][] matrix, boolean[][] visit, int i, int j, int step) {
visit[i][j] = true;
int max = step;
int m = matrix.length, n = matrix[0].length;
//        if (i > 0 && matrix[i-1][j] == matrix[i][j]+1 && !visit[i-1][j]) {
//            int len = helper(matrix, visit, i-1, j, step+1);
//            max = max > len ? max : len;
//        }
//        if (i < m-1 && matrix[i+1][j] == matrix[i][j]+1 && !visit[i+1][j]) {
//            int len = helper(matrix, visit, i+1, j, step+1);
//            max = max > len ? max : len;
//        }
//        if (j > 0 && matrix[i][j-1] == matrix[i][j]+1 && !visit[i][j-1]) {
//            int len = helper(matrix, visit, i, j-1, step+1);
//            max = max > len ? max : len;
//        }
//        if (j < n-1 && matrix[i][j+1] == matrix[i][j]+1 && !visit[i][j+1]) {
//            int len = helper(matrix, visit, i, j+1, step+1);
//            max = max > len ? max : len;
//        }
int r = (i-1+m) % m;
int c = j;
if (matrix[r][c] == matrix[i][j]+1 && !visit[r][c]) {
int len = helper(matrix, visit, r, c, step+1);
max = max > len ? max : len;
}
r = (i+1+m) % m;
c = j;
if (matrix[r][c] == matrix[i][j]+1 && !visit[r][c]) {
int len = helper(matrix, visit, r, c, step+1);
max = max > len ? max : len;
}
r = i;
c = (j-1+n) % n;
if (matrix[r][c] == matrix[i][j]+1 && !visit[r][c]) {
int len = helper(matrix, visit, r, c, step+1);
max = max > len ? max : len;
}
r = i;
c = (j+1+n) % n;
if (matrix[r][c] == matrix[i][j]+1 && !visit[r][c]) {
int len = helper(matrix, visit, r, c, step+1);
max = max > len ? max : len;
}
visit[i][j] = false;
return max;
}
public static void main(String[] args) {
int[][] matrix = {{5, 6, 7},
{4, 10, 9},
{3, 2, 8}};
LIS2d lis = new LIS2d();
System.out.println(lis.findLongest(matrix));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: