Longest Line of Consecutive One in Matrix

Given a 01 matrix, find the longest line of consecutive 1 in the matrix. The line could be horizontal, vertical, diagonal or anti-diagonal.

Example 1:

Input: 
  [[0,1,1,0],
   [0,1,1,0],
   [0,0,0,1]]
Output: 3
Explanation: (0,1) (1,2) (2,3)

Example 2:

Input: [[0,0],[1,1]]
Output: 2

https://www.cnblogs.com/grandyang/p/6900866.html
我们也可以考虑用DP解法来做,我们建立一个三维dp数组,其中dp[i][j][k]表示从开头遍历到数字nums[i][j]为止,第k种情况的连续1的个数,k的值为0,1,2,3,
分别对应水平,竖直,对角线和逆对角线这四种情况。之后就是更新dp数组的过程了,如果如果数字为0的情况直接跳过,然后水平方向就加上前一个的dp值,竖直方向加上上面
一个数字的dp值,对角线方向就加上右上方数字的dp值,逆对角线就加上左上方数字的dp值,然后每个值都用来更新结果res,参见代码如下:
 1 class Solution2 {
 2     int longestLine(int[][] M) {
 3         if (M == null || M.length == 0 || M[0].length == 0) return 0;
 4         int m = M.length, n = M[0].length, res = 0;
 5         int[][][] dp = new int[m][n][4];
 6         for (int i = 0; i < m; ++i) {
 7             for (int j = 0; j < n; ++j) {
 8                 if (M[i][j] == 0) continue;
 9                 for (int k = 0; k < 4; ++k) dp[i][j][k] = 1;
10                 if (j > 0) dp[i][j][0] += dp[i][j - 1][0]; // horizonal
11                 if (i > 0) dp[i][j][1] += dp[i - 1][j][1]; // vertical
12                 if (i > 0 && j < n - 1) dp[i][j][2] += dp[i - 1][j + 1][2]; // diagonal
13                 if (i > 0 && j > 0) dp[i][j][3] += dp[i - 1][j - 1][3]; // anti-diagonal
14                 res = Math.max(res, Math.max(dp[i][j][0], dp[i][j][1]));
15                 res = Math.max(res, Math.max(dp[i][j][2], dp[i][j][3]));
16             }
17         }
18         return res;
19     }
20 }

 

你可能感兴趣的:(Longest Line of Consecutive One in Matrix)