《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.托普利茨矩阵的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 766. 托普利茨矩阵

数据结构与算法之深入解析“托普利茨矩阵”的求解思路与算法示例

LeetCode210511至少是其他数字两倍的最大数和托普利茨矩阵

托普利茨矩阵

托普利茨矩阵

《LeetCode之每日一题》:280.矩阵置零