562. 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 }

浙公网安备 33010602011771号