题目描述:
给定一个01矩阵 M,找到矩阵中最长的连续1线段。这条线段可以是水平的、垂直的、对角线的或者反对角线的。
示例:
输入:
[[0,1,1,0],
[0,1,1,0],
[0,0,0,1]]
输出: 3
提示: 给定矩阵中的元素数量不会超过 10,000。
方法1:
主要思路:
(1)动态规划;
class Solution {
public:
int longestLine(vector<vector<int>>& M) {
if(M.empty()||M[0].empty()){//处理特殊的情形
return 0;
}
//矩阵的行和列
int len_row=M.size();
int len_col=M[0].size();
//动态数组,分别保存行,列,对角线和反对角线上的当前元素下连续1的个数
vector<int> rows(len_col,0);
vector<int> cols(len_col,0);
vector<int> dia(len_col,0);
vector<int> rev_dia(len_col,0);
int res=0;//保存中间出现过的最长的长度
//遍历数组元素
for(int i=0;i<len_row;++i){
int pre=dia[0];//辅助对角线数组数组,初始值置为对角线数组的首元素
for(int j=0;j<len_col;++j){
if(M[i][j]==1){//元素为1时,更新可能的最长的长度
rows[j]=j>0?rows[j-1]+1:1;//行
cols[j]=i>0?cols[j]+1:1;//列
//对角线
int tmp=dia[j];
dia[j]=i>0&&j>0?pre+1:1;
pre=tmp;
//反对角线
rev_dia[j]=i>0&&j<len_col-1?rev_dia[j+1]+1:1;
//更新可能的最大值
res=max(res,rows[j]);
res=max(res,cols[j]);
res=max(res,dia[j]);
res=max(res,rev_dia[j]);
}
else{
//更新元素值为0
rows[j]=0;
cols[j]=0;
pre=dia[j];
dia[j]=0;
rev_dia[j]=0;
}
}
}
return res;//返回结果
}
};