最长上升连续子序列 II
来源:互联网 发布:荔波二中七天网络 编辑:程序博客网 时间:2024/05/22 11:49
给定一个整数矩阵(其中,有 n 行, m 列),请找出矩阵中的最长上升连续子序列。(最长上升连续子序列可从任意行或任意列开始,向上/下/左/右任意方向移动)。
样例
给定一个矩阵
[ [1 ,2 ,3 ,4 ,5], [16,17,24,23,6], [15,18,25,22,7], [14,19,20,21,8], [13,12,11,10,9]]
返回 25
挑战
O(nm) 时间复杂度及存储。
class Solution {public: /** * @param A an integer matrix * @return an integer */ int longestIncreasingContinuousSubsequenceII(vector<vector<int>>& A) { // Write your code here int m = A.size(); int n = A[0].size(); memset(buf, 0, m*n*sizeof(int)); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (buf[i][j] != 0) { continue; } int beginX = i; int beginY = j; int maxLen = 1; findBegin(A, m, n, i, j, beginX, beginY, 1, maxLen); buf[beginX][beginY] = 1; visit(A, m, n, beginX, beginY); } } int result = 0; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (buf[i][j] > result) { result = buf[i][j]; } } } return result; }private: void findBegin(vector<vector<int> > &A, int m, int n, int i, int j, int &beginX, int &beginY, int len, int &maxLen) { if (i-1 >= 0) { if (A[i-1][j] == A[i][j]-1) { if (len+1 > maxLen) { beginX = i-1; beginY = j; maxLen = len+1; findBegin(A, m, n, i-1, j, beginX, beginY, len+1, maxLen); } } } if (i+1 < m) { if (A[i+1][j] == A[i][j]-1) { if (len+1 > maxLen) { beginX = i+1; beginY = j; maxLen = len+1; findBegin(A, m, n, i+1, j, beginX, beginY, len+1, maxLen); } } } if (j-1 >= 0) { if (A[i][j-1] == A[i][j]-1) { if (len+1 > maxLen) { beginX = i; beginY = j-1; maxLen = len+1; findBegin(A, m, n, i, j-1, beginX, beginY, len+1, maxLen); } } } if (j+1 < n) { if (A[i][j+1] == A[i][j]-1) { if (len+1 > maxLen) { beginX = i; beginY = j+1; maxLen = len+1; findBegin(A, m, n, i, j+1, beginX, beginY, len+1, maxLen); } } } } void visit(vector<vector<int> > &A, int m, int n, int i, int j) { if (i-1 >= 0) { if (A[i-1][j] == A[i][j]+1) { buf[i-1][j] = buf[i][j]+1; visit(A, m, n, i-1, j); } } if (i+1 < m) { if (A[i+1][j] == A[i][j]+1) { buf[i+1][j] = buf[i][j]+1; visit(A, m, n, i+1, j); } } if (j-1 >= 0) { if (A[i][j-1] == A[i][j]+1) { buf[i][j-1] = buf[i][j]+1; visit(A, m, n, i, j-1); } } if (j+1 < n) { if (A[i][j+1] == A[i][j]+1) { buf[i][j+1] = buf[i][j]+1; visit(A, m, n, i, j+1); } } } int buf[100][100];};
0 0
- 最长上升连续子序列 II
- 最长上升连续子序列
- 最长上升连续子序列
- 最长连续上升子序列
- 最长上升连续子序列
- 最长上升连续子序列
- 最长上升连续子序列
- 最长上升连续子序列
- 最长上升连续子序列
- 最长上升连续子序列
- 最长上升连续子序列
- 最长上升子序列II
- hdu1069-最长连续上升子序列
- 题目:最长上升连续子序列
- LintCode--最长上升连续子序列
- lintcode-最长上升连续子序列-397
- 最长上升连续子序列(LintCode)
- LintCode- 最长上升连续子序列
- 文章标题
- Python脚本启动Java服务
- LeetCode-String To Integer
- Python Tips 持续更新
- JDK的安装图解
- 最长上升连续子序列 II
- 第一次找工作的辛酸泪史,共勉。
- 用Spring+Hibernate做项目时候遇到 java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit
- DBCP连接池的使用小结
- aaxspring
- java 读取Excel (利用poi,jxl插件)
- 文章标题
- 模板方法模式
- 天地融面试题