BiruLyu
7/5/2017 - 11:42 PM

562. Longest Line of Consecutive One in Matrix(1st).java

public class Solution {
    public int longestLine(int[][] M) {
        if (M == null || M.length < 1 || M[0].length < 1) return 0;
        int m = M.length;
        int n = M[0].length;
        int[][][] dp = new int[m][n][4];
        int res = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (M[i][j] == 0) continue;
                for (int k = 0; k < 4; k++) dp[i][j][k] = 1;
                if (i > 0) dp[i][j][0] += dp[i - 1][j][0]; // vertical line 
                if (j > 0) dp[i][j][1] += dp[i][j - 1][1]; // horizontal
                if (i > 0 && j > 0) dp[i][j][2] += dp[i - 1][j - 1][2]; // anti-diagonal
                if (i > 0 && j < n - 1) dp[i][j][3] += dp[i - 1][j + 1][3]; // diagonal
                res = Math.max(res, Math.max(dp[i][j][0], dp[i][j][1]));
                res = Math.max(res, Math.max(dp[i][j][2], dp[i][j][3]));
            }
        }
        return res;
    }
}
public class Solution {
    public int longestLine(int[][] M) {
        int l = M.length;
        if(l==0)
            return 0;
        int w = M[0].length;
        int horizen[] = new int [w];
        int ver= 0;
        int dia [] = new int [l+w-1];
        int anti [] = new int [l+w-1];
        int result = 0;
        for(int i=0;i<l;i++){
            ver = 0;
            for(int j=0;j<w;j++){
                if(M[i][j]==1){
                    horizen[j]++;
                    ver++;
                    dia[i+j]++;
                    anti[l-1-(i-j)]++;
                }else{
                    result = Math.max(ver, result);
                    ver = 0;
                    result = Math.max(horizen[j], result);
                    horizen[j] = 0;
                    result = Math.max(dia[i+j], result);
                    dia[i+j] = 0;
                    result = Math.max(anti[l-1-(i-j)], result);
                    anti[l-1-(i-j)] = 0;
                }
                
                
            }
            if(ver>0){
                result = Math.max(ver, result);
            }
        }
        
        for(int i=0;i<w;i++){
            result = Math.max(horizen[i], result);
        }
        for(int i=0;i<w+l-1;i++){
            result = Math.max(anti[i], result);
            result = Math.max(dia[i], result);
        }
        
        return result;
        
    }
}