题目链接:https://leetcode-cn.com/problems/toeplitz-matrix/
(BFS写魔怔了,看啥都想用BFS解决,这题其实只需要简单遍历即可,当然用BFS也没问题)
方法一:BFS
由于题目要求矩阵上每一条由左上到右下的对角线上的元素都相同,所以可以使用BFS从右上角的元素开始搜索,每次访问其左边和下面的元素,对比这些元素,如果这些元素没有全部相同,那么这个矩阵一定不是题目要求的托普利茨矩阵。如果全部相同,再将这些元素进行BFS搜索,持续进行相同的步骤即可。如果最后BFS的队列为空,那么自然可以确定这个矩阵是一个托普利茨矩阵。
代码(C++)
class Solution {
public:
bool isToeplitzMatrix(vector<vector<int>>& matrix) {
int dir[2][2] = {
{1, 0},
{0, -1}
};
int m = matrix.size() ;
int n = matrix[0].size() ;
vector<vector<bool> > tag(m, vector<bool >(n, false)) ;
queue<pair<int, int> > q ;
q.emplace(make_pair(0, n - 1)) ;
tag[0][n - 1] = true ;
while (! q.empty()) {
int num = -1 ;
int size = q.size() ;
for (int i = 0;i < size;i++) {
pair<int, int> p = q.front() ;
q.pop() ;
for (auto& i : dir) {
int next_x = p.first + i[0] ;
int next_y = p.second + i[1] ;
if (next_x >= 0 && next_x < m && next_y >= 0 && next_y < n && tag[next_x][next_y] == false ) {
tag[next_x][next_y] = true ;
if (num == -1) num = matrix[next_x][next_y] ;
else {
if (matrix[next_x][next_y] != num) {
return false ;
}
}
q.emplace(make_pair(next_x, next_y)) ;
}
}
}
}
return true;
}
};
方法二:遍历
从左到右,从上到下遍历矩阵中的元素,每次遍历,对于一个元素,只需要检查该元素与其右下方的元素是否相同,一旦有一个元素与其右下方的元素不同,那么这个矩阵一定不是托普利茨矩阵。
代码(C++)
class Solution {
public:
bool isToeplitzMatrix(vector<vector<int>>& matrix) {
int m = matrix.size() ;
int n = matrix[0].size() ;
for (int i = 0;i < m - 1;i++) {
for (int j = 0;j < n - 1;j++) {
if (matrix[i][j] != matrix[i + 1][j + 1]) return false ;
}
}
return true ;
}
};