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
[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)); } }
相关文章推荐
- Arduino 的读串口与写串口
- selenium系列->Actions命令实例整理->setSpeed(Value)
- StringBuilder与StringBuffer
- 【9-4】迭代dict的key和value
- POJ-1947 Rebuilding Roads (树形DP+分组背包)
- 【9-3】迭代dict的value
- queryTask
- uva 1584.Circular Sequence
- 三、安卓UI学习(1)
- 理解 Android Build 系统
- HDU1159 && POJ1458:Common Subsequence(LCS)
- 基于WindowsIocp及Duilib的服务器
- Android UI基础——CheckBox&RadioButton控件
- poj 2533 Longest Ordered Subsequence(LIS)
- UI控件--上下文Menu
- 苹果开发工具:Xcode和Interface Builder
- IOS 使用Interface Builder开发界面入门与技巧
- UI控件--PopWindow
- 第63课:Spark SQL下Parquet内幕深度解密学习笔记
- HD 1159 Common Subsequence (最长公共子序列)