关于操作矩阵中索引的技巧(一)

来源:互联网 发布:淘宝退货要申请售后吗 编辑:程序博客网 时间:2024/06/05 02:05

一般情况下,写代码需要操作矩阵,因为有些算法题目,是要对矩阵操作的。现在就拿二维矩阵来说

Input:[[0,1,1,0], [0,1,1,0], [0,0,0,1]]Output: 3
这个矩阵,想要看连续最长序列的长度,要看水平,垂直,主对角线,反对角线上,连续的1的长度。

现在主要拿主对角线,和反对角线来说:

对于主对角线,只需要检测(0,0), (1,0),(2,0),(2,0),(2,1),(2,2),(2,3)这几个位置

而一共有m+n = 7个位置需要检测(m = 3, n = 4,矩阵高度和宽度)

那么选取k = 0, 1, 2, 3, 4, 5, 6 (k = 0, k < n+m)

然后可以看到,第一个做表取值为:0,1,2,2,2,2,2,第二个做表取值为:0,0,0,0,1,2,3

那么接下来要做的,就是操作k,以及m,n来是的,操作结果是以上两个序列:

首先想到,采用max(k, m-1)来获取该序列,而对于第二个序列,max(0, k-m)这样便得到了相应的矩阵下表操作结果,之后,只需要带入for循环中,便可以对矩阵进行操作。


同理,低于反对角线,也可以这么操作,只需要检测(2,0),(1,0),(0,0),(0,0),(0,1),(0,2),(0,3)这几个位置

按照上面的分析技巧,可以得到 i = max(0, m-k-1), j = max(0, k-m)


class Solution3 {
public:
int longestLine(vector<vector<int>>& M) {
if (M.empty()) return 0;
int m = M.size(), n = M[0].size();
int max_ = 0;


int horical = 0;
for (int i = 0; i < m; i++)
{
for (int j = 0, horical = 0; j < n; j++)
{
horical = M[i][j] ? horical + 1 : 0;
max_ = max(max_, horical);
}
}


int vertical = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0, vertical = 0; j < m; j++)
{
vertical = M[j][i] ? vertical + 1 : 0;
max_ = max(max_, vertical);
}
}


int diagonal = 0, anti_diagonal = 0;
for (int k = 0; k < m + n; k++)
{
for (int i = min(k, m - 1), j = max(0, k - m), diagonal = 0; i >= 0 && j < n; i--, j++)
{
diagonal = M[i][j] ? diagonal + 1 : 0;
max_ = max(max_, diagonal);
}


for (int i = max(k - m - 1, 0), j = max(0, k - m), anti_diagonal = 0; i < m && j < n; i++, j++)
{
anti_diagonal = M[i][j] ? anti_diagonal + 1 : 0;
max_ = max(max_, anti_diagonal);
}
}
return max_;
}
};

0 0
原创粉丝点击