题目:
Given a 01 matrix M, find the longest line of consecutive one in the matrix. The line could be horizontal, vertical, diagonal or anti-diagonal.
Example:
Input: [[0,1,1,0], [0,1,1,0], [0,0,0,1]] Output: 3
Hint: The number of elements in the given matrix will not exceed 10,000.
思路:
没有什么好的技巧,逐行找,逐列找,然后正对角线找,反对角线找。算法的时间复杂度是O(mn),空间复杂度是O(1),其中m和n分别是矩阵的行个数和列个数。
代码:
class Solution {
public:
int longestLine(vector<vector<int>>& M) {
if (M.empty() || M[0].empty()) {
return 0;
}
int m = M.size(), n = M[0].size();
int maxl = 0, hori = 0, vert = 0, inc = 0, desc = 0;
for (int i = 0; i < m; ++i) {
for (int j = 0, hori = 0; j < n; ++j) {
hori = M[i][j] ? hori + 1 : 0;
maxl = max(maxl, hori);
}
}
for (int j = 0; j < n; ++j) {
for (int i = 0, vert = 0; i < m; ++i) {
vert = M[i][j] ? vert + 1 : 0;
maxl = max(maxl, vert);
}
}
for (int k = 0; k < m + n; k++) {
int j = max(0, k - m), inc = 0;
for (int i = min(k, m - 1); i >= 0 && j < n; --i, ++j) {
inc = M[i][j] ? inc + 1 : 0;
maxl = max(maxl, inc);
}
j = max(0, k - m), desc = 0;
for (int i = max(m - 1 - k, 0); i < m && j < n; ++i, ++j) {
desc = M[i][j] ? desc + 1 : 0;
maxl = max(maxl, desc);
}
}
return maxl;
}
};