力扣 766. 托普利茨矩阵

题目说明

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

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

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

示例

例1

1
2
3
4
5
6
输入: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 。

例2

1
2
3
4
5
输入:[1,2,2,3,1,4,2]
输出:6
解释:
输入数组的度是3,元素2的出现频数最大,为3.
最短连续子数组[2,2,3,1,4,2]的长度为6,所以返回6.

笔者理解

此题是一道数组算法问题,在力扣题库中被定义为简单题。

解法

当笔者阅读完此题后,发现此题还是比较直接,遍历比较当前行和上一行的部分元素即可,需要注意的是考虑到一行或者一列的特殊情况,以及尽量的提高效率,让我们来看看具体如何实现的吧。

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public boolean isToeplitzMatrix(int[][] matrix) {
int row = matrix.length;
//矩阵行数

int column = matrix[0].length;
//矩阵列数

if(row==1||column==1){ return true;}
//行或列都为1时必定符合要求

ArrayList <Integer> temp = new ArrayList<Integer>();
//暂存上一行前部分元素

for (int i = 0; i < column-1; i++) {
temp.add(matrix[0][i]);
//添加第一行除最后一个元素
}
for (int i = 1; i < row; i++) {
for (int j = 1; j < column; j++) {
//从第二个元素开始比较

if(temp.get(j-1)!=matrix[i][j]){
return false;
}
}
temp.remove(temp.size()-1);
temp.add(0,matrix[i][0]);
//移去上一行尾元素
//添加这一行首元素
}
return true;
}

时间和空间效率都还行,可见此解法还比较适合此题;

image.png

总结

本题是今天的每日一题,难度是简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。