您的位置:首页 > 其它

[Leetcode] 562. Longest Line of Consecutive One in Matrix 解题报告

2017-12-24 09:41 513 查看
题目

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,
4000
0); i < m && j < n; ++i, ++j) {
desc = M[i][j] ? desc + 1 : 0;
maxl = max(maxl, desc);
}
}
return maxl;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: