《LeetCode之每日一题》:76.托普利茨矩阵
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:76.托普利茨矩阵相关的知识,希望对你有一定的参考价值。
题目链接: 托普利茨矩阵
有关题目
给你一个 m x n 的矩阵 matrix 。
如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。
如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 20
0 <= matrix[i][j] <= 99
进阶:
如果矩阵存储在磁盘上,并且内存有限,以至于一次最多只能将
矩阵的一行加载到内存中,该怎么办?
答:一次最多只能将矩阵的一行加载到内存中,我们将每一行复制到一个连续数组中,随后在读取下一行时,就与内存中此前保存的数组进行比较。
注意实现过程中,从右往左遍历,并跟提前存储在数组中上一组元素的左上角元素进行比较。
如果矩阵太大,以至于一次只能将不完整的一行加载到内存中,该怎么办?
答:一次只能将不完整的一行加载到内存中,我们将整个矩阵竖
直切分成若干子矩阵,并保证两个相邻的矩阵至少有一列或一行
是重合的,然后判断每个子矩阵是否符合要求。
题解
法一:遍历
思路:
根据托普利茨矩阵的定义,留意代码实现中的初始值
class Solution {
public:
bool isToeplitzMatrix(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
for (int i = 1; i < m; i++)//注意初始值
{
for (int j = 1; j < n; j++)
{
if (matrix[i][j] != matrix[i - 1][j - 1])
return false;
}
}
return true;
}
};
法二:斜线遍历
思路:
由于矩阵不一定是方阵,我们从右上角元素和左下角元素进行斜线遍历
class Solution {
public:
bool isToeplitzMatrix(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
int row = m, col = n;//定义行列
while(col-- > 0){
for (int i = 0 , j = col , val = matrix[i++][j++]; i < m && j < n; i++,j++)
if(matrix[i][j] != val) return false;
}
while(row-- > 0)
{
for (int i = row , j = 0 , val = matrix[i++][j++]; i < m && j < n; i++,j++)
if (matrix[i][j] != val) return false;
}
return true;
}
};
以上是关于《LeetCode之每日一题》:76.托普利茨矩阵的主要内容,如果未能解决你的问题,请参考以下文章
数据结构与算法之深入解析“托普利茨矩阵”的求解思路与算法示例