【力扣】766. 托普利茨矩阵

217 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 3 天,点击查看活动详情

题目链接

766. 托普利茨矩阵 - 力扣(LeetCode)

题目描述

给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。

如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵

测试用例

用例1:

image.png

输入:matrix = [[1,2,3,4],[5,1,2,3],[9,5,1,2]]
输出:true
解释:
在上述矩阵中, 其对角线为: 
"[9]", "[5, 5]", "[1, 1, 1]", "[2, 2, 2]", "[3, 3]", "[4]"。 
各条对角线上的所有元素均相同, 因此答案是 True 。

限制

m == matrix.length
n == matrix[i].length
1 <= m, n <= 20
0 <= matrix[i][j] <= 99

题目分析

根据题目对 托普利茨矩阵 的定义,我们需要检查数组中,每一个右斜线的元素,是否相等。再将这个判断条件简化,可以变为,我们只需要检查,每一个格子,是否与他左上角的格子相等即可,即存在一个判断条件: matrix[i][j] == matrix[i+1][j+1]

代码实现

完整的代码实现如下

var isToeplitzMatrix = function(matrix) {
    //有多少行
    let row=matrix.length;
    //有多少列
    let col=matrix[0].length;
    for(let i=1;i<col;i++){
        for(let j=1;j<row;j++){
            if(matrix[j][i]!=matrix[j-1][i-1]){
                return false;
            }
        }
    }
    return true;
};

image.png

解法 2

通过对示例的观察,我们可以发现一个隐藏的特性:将数组的上一行往右移动一格后,上一行与下一行,他们中间的元素是相等的,即 line1[0, len-1] = line2[1, len],如下图所示

image.png

那么,我们可以遍历数组,检查相邻的两行,他们中间的元素是否相等,即可

var isToeplitzMatrix = function(matrix) {
    function check(arr1, arr2) {
        for (let i = 0; i < arr1.length - 1; i++) {
            if (arr1[i] != arr2[i + 1]) return false;
        }
        return true;
    }
    if (matrix.length == 1) return true;
    for (let n = 0; n < matrix.length - 1; n++) {
        if (!check(matrix[n], matrix[n + 1])) {
            return false;
        }
    }
    return true;
};

image.png