持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 3 天,点击查看活动详情
题目链接
题目描述
给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。
如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。
测试用例
用例1:
输入: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;
};
解法 2
通过对示例的观察,我们可以发现一个隐藏的特性:将数组的上一行往右移动一格后,上一行与下一行,他们中间的元素是相等的,即 line1[0, len-1] = line2[1, len],如下图所示
那么,我们可以遍历数组,检查相邻的两行,他们中间的元素是否相等,即可
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;
};