766. Toeplitz Matrix。

A matrix is Toeplitz if every diagonal from top-left to bottom-right has the same element.

Now given an M x N matrix, return True if and only if the matrix is Toeplitz.

Example 1:

Input: matrix = [[1,2,3,4],[5,1,2,3],[9,5,1,2]]
Output: True
Explanation:
1234
5123
9512

In the above grid, the diagonals are “[9]”, “[5, 5]”, “[1, 1, 1]”, “[2, 2, 2]”, “[3, 3]”, “[4]”, and in each diagonal all elements are the same, so the answer is True.

Example 2:

Input: matrix = [[1,2],[2,2]]
Output: False
Explanation:
The diagonal “[1, 2]” has different elements.

Note:

  • matrix will be a 2D array of integers.
  • matrix will have a number of rows and columns in range [1, 20].
  • matrix[i][j] will be integers in range [0, 99].

题目挺简单的,就是从左上角到右下角的每个对角线上的元素是否相等。


最简单的做法就是比较当前元素和对角线上的下一个元素是否相等即可,需要注意的是我们每行需要对比的元素可以除去最后一个。

class Solution {
public:
    bool isToeplitzMatrix(vector<vector<int>>& matrix) {
        for(int i=0;i<matrix.size()-1;i++) {
            for(int j=0;j<matrix[0].size()-1;j++) {
                if(matrix[i][j] != matrix[i+1][j+1]) {
                    return false;
                }
            }
        }
        return true;
    }
};

还有一种是刚开始思考时写的,但是对比上面的那个时间复杂度没有下降,反而还占用了多余的空间复杂度。

这个思路是用一个map保存当前元素和下一行中这个元素的预期列数,而且是把列作为key,元素作为value。需要首先把第一行的元素(除了最后一个)放入map中。然后再对其他行进行对比,比较预期位置上的元素和当前位置上的元素是否相等,并且将每行的第一个新元素放入其中,并更新其他位置上的列数(列数向后移动一位)。

比如题中的例子:[[1,2,3,4],[5,1,2,3],[9,5,1,2]]。

首先把第一行的内容放入map中:1:1,2:2,3:3,代表着下一行的下标为1的元素是1,下标为2的元素是2,下标为3的元素是3.

然后遍历第二行:发现下标为3的元素为3,与上面的一致,其他位置上也是,并且发现了一个新的元素5,然后此时的map为:1:5,2:1,3:2,4:3,代表着下一行的下标为1的元素是5,下标为2的元素是1,下标为3的元素是2等。

依此论推。

class Solution {
public:
    bool isToeplitzMatrix(vector<vector<int>>& matrix) {
        unordered_map<int,int> ans;//用来保存元素和下一个坐标的位置
        int r = matrix.size();//多少行
        int c = matrix[0].size();//多少列
        if(r == 1 || c == 1) {
            return true;
        }
        int i=0;
        while(i < c-1) {
            ans[i+1] = matrix[0][i];
            //cout << "当前元素:" << matrix[0][i] << ",下一个预期的坐标" << i+1 << endl;
            i++;
        }
        for(i=1;i<r;i++) {
            int j=c-1;
            while(j > 0) {//比较其他的是否与预期的一样
                //cout << j << "," << ans[j] << "," << matrix[i][j] << endl;
                if(ans[j] == matrix[i][j]) {//如果一样则更新信息
                    ans[j+1] = matrix[i][j];
                } else {
                    //cout << "quit" << i << "," << j;
                    return false;
                }
                j--;
            }
            ans[1] = matrix[i][0];//将新的加入其中
        }
        return true;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值