562矩阵中最长的连续1线段

    科技2024-03-27  93

    题目描述: 给定一个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;//返回结果 } };
    Processed: 0.011, SQL: 8